【Redis】事务

文章目录

  • 事务的概念
  • 事务操作
    • MULTI
    • EXEC
    • DISCARD
    • WATCH
    • UNWATCH

事务的概念

Redis 的事务和 MySQL 的事务概念上是类似的. 都是把⼀系列操作绑定成⼀组. 让这⼀组能够批量执 ⾏

Redis 的事务和 MySQL 事务的区别

  • 弱化的原⼦性: redis 没有 “回滚机制”. 只能做到这些操作 “批量执⾏”. 不能做到 "⼀个失败就恢复到 初始状态
  • 不具备⼀致性: redis没有约束, 也没有回滚机制,事务执行过程当中如果某个操作出现失败,就可能引起不一致的问题。 MySQL 的⼀致性体现的是运⾏事务前和运⾏后, 结果都 是合理有效的, 不会出现中间⾮法状态
  • 不需要隔离性: 因为redis是单线程模型的服务器程序,所有的请求都是串行执行,也没有隔离级别, 因为不会并发执⾏事务
  • 不需要持久性: redis数据是保存在内存的,虽然redis有持久化机制,但是否开启持久化, 是redis-server ⾃⼰的事情, 和事务⽆关

关于redis是否有原子性的争议

原子:不可拆分的最小单位,原子性最原本的含义:把多个逻辑相关的操作放到一起,要么全部执行(不保证成功),要么全部不执行

redis确实做到了上述的含义,但是如果事务当中有若干个操作,存在有失败,那就失败吧,不会有回滚操作

但是MySQL的原子性:把多个逻辑相关的操作放到一起,要么全部执行 成功,要么全部不执行,如果事务当中有操作执行失败,要进行回滚,把中间已经执行的操作全部回退到最初的状态。正是因为MySQL提高了原子性的门槛,让人们讨论原子性的时候,更多的是想到的MySQL这种带有回滚的原子性

网上说:redis事务具有原子性(这里的原子性指的是:只是把相关操作打包放一起执行),有的说没有原子性(这里的原子性指的是:将操作打包放到一起执行&带有回滚机制 => 打包一起正确执行)

在旧版本的redis当中,认为redis的事务是原子性的,但是在新版本当中就把这句话删除了,潜台词就是也认同了原子性更贴近MySQL这种原子性的设定

image-20231030101150754

redis的事务主要的意义就是为了打包, 避免其它客户端的命令,插队插到中间


Redis 中实现事务是引入了队列(每个客户端都有一个队列),开启事务的时候,此时客户端输入的命令就会发给服务器并且进入到这个队列当中(但是并不会⽴即执⾏),当真正收到 EXEC 命令(执行事务的命令)之后, 才真正执⾏队列中的所有操作,将队列当中的这些任务都按照顺序依次执行(redis会把事务当中的操作都执行完再处理别的客户端)

因此, Redis 的事务的功能相⽐于 MySQL 来说, 是弱化很多的. 只能保证事务中的这⼏个操作是 “连续 的”, 不会被别的客⼾端阻塞

为什么redis事务这么简单,为什么不设计成和MySQL一样强大

因为MySQL的事务在背后付出了很大的代价:空间上要花费更大的空间来存储更大的数据,时间上要有更大的执行开销


事务的案例1:抢票

image-20231030102153476


事务操作

MULTI

开启⼀个事务. 执⾏成功返回 OK.

EXEC

真正执⾏事务,每次添加⼀个操作, 都会提⽰ “QUEUED”, 说明命令已经进⼊客⼾端的队列了. 真正执⾏ EXEC 的时候, 客⼾端才会真正把上述操作发送给服务器

image-20231030110500895

DISCARD

放弃当前事务. 此时直接清空事务队列. 之前的操作都不会真正执⾏到

WATCH

在执⾏事务的时候, 如果某个事务中修改的值, 被别的客⼾端修改了, 此时就容易出现数据不⼀致的问题

  • 当开启事务的时候, 如果对 watch 的 key 进⾏修改, 就会记录当前 key 的 “版本号”.
  • 在真正提交事务的时候, 会判断当前这个key的版本号和最初进行watch的时候记录的版本号是否一致
    • 如果一致:说明当前key在事务开启到最终执行的过程当中,没有别的客户端修改,此时才能真正进行设置操作
    • 如果不一直,说明key在其它客户端修改过了,此时就直接丢弃事务当中的操作,exec返回nil

注意:

1)redis的watch相当于是基于版本号这样的机制来实现乐观锁

2)watch本质上就是给exec加了判定条件,并且watch必须搭配事务使用,并且必须要再multi之前使用

3)当执行watch key的时候,会给这个key安排一个版本号并且记录这个版本号,版本号是一个整数, 每次修改都会使版本号变⼤,服务器来维护每个 key 的版本号情况

image-20231030111152925

UNWATCH

取消对 key 的监控

当开启事务,并且给服务器发送了若干个命令之后,此时服务器重启,这时候的事务怎么办

此时的效果就等同于discard


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/186066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 STM32F7 和神经网络的实时人脸特征提取与匹配算法实现

本文讨论了如何使用 STM32F7 和神经网络模型来实现实时人脸特征提取与匹配算法。首先介绍了 STM32F7 的硬件和软件特点,然后讨论了人脸特征提取和匹配算法的基本原理。接下来,我们将重点讨论如何在 STM32F7 上实现基于神经网络的人脸特征提取与匹配算法&…

2023年亚太杯数学建模A题解题思路(*基于OpenCV的复杂背景下苹果目标的识别定位方法研究)

摘要 由于要求较高的时效性和劳力投入,果实采摘环节成为苹果生产作业中十分重要的一部分。而对于自然环境下生长的苹果,光照影响、枝叶遮挡和果实重叠等情况普遍存在,这严重影响了果实的准确识别以及采摘点的精确定位。针对在复杂背景下苹果的…

Spring - Mybatis-设计模式总结

Mybatis-设计模式总结 1、Builder模式 2、工厂模式 3、单例模式 4、代理模式 5、组合模式 6、模板方法模式 7、适配器模式 8、装饰者模式 9、迭代器模式 虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,…

【迅搜03】全文检索、文档、倒排索引与分词

全文检索、文档、倒排索引与分词 今天还是概念性的内容,但是这些概念却是整个搜索引擎中最重要的概念。可以说,所有的搜索引擎就是实现了类似的概念才能称之为搜索引擎。而且今天的内容其实都是相关联的,所以不要以为标题上有四个名词就感觉好…

基于JavaWeb+SSM+Vue微信阅读小程序的设计和实现

基于JavaWebSSMVue微信阅读小程序的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏[Java 源码获取 源码获取入口 Lun文目录 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 1 第2章 开发环境与技术 3 2.1 MYSQL数据库 3 2.2 JSP技…

微信小程序富文本拓展rich-text

微信小程序富文本插件 功能介绍 支持解析<style>标签中的全局样式支持自定义默认的标签样式支持自动设置标题 若html中存在title标签,将自动把title标签的内容设置到页面的标题上,并在回调bindparse中返回,可以用于转发支持添加加载提示 可以在Parser标签内添加加载提…

电机应用-直流有刷电机多环控制实现

目录 直流有刷电机多环控制实现 硬件设计 直流电机三环&#xff08;速度环、电流环、位置环&#xff09;串级PID控制-位置式PID 编程要点 配置ADC可读取电流值 配置基本定时器6产生定时中断读取当前电路中驱动电机的电流值并执行PID运算 配置定时器1输出PWM控制电机 配…

jenkins + gitlab 自动部署(webhook)

Jenkins是一个流行的开源CI/CD工具&#xff0c;可以与Git等版本控制系统集成&#xff0c;实现自动构建、测试和部署。Webhook是一种机制&#xff0c;可以在Git仓库中设置&#xff0c;在代码提交或合并请求时触发Jenkins构建任务&#xff0c;以完成自动化部署。 实操 设备信息 …

DELL MD3600F存储重置管理软件密码

注意&#xff1a;密码清除可能会导致业务秒断&#xff0c;建议非业务时间操作 针对一台控制器操作即可&#xff0c;另一控制器会同步操作 重置后密码为空&#xff01; 需求&#xff1a;重置存储管理软件密码 管理软件中分配物理磁盘时提示输入密码(类似是否了解风险确认操作的提…

前端(HTML + CSS + JS)

文章目录 一、HTML1. 概念&#xff08;1&#xff09;HTML 文件基本结构&#xff08;2&#xff09;HTML代码框架 2. 、HTML常见标签 二、CSS1. CSS基本语法规范2. 用法&#xff08;1&#xff09; 引用方式&#xff08;2&#xff09;选择器&#xff08;3&#xff09;常用元素属性…

面向对象三大特性,类与接口,java重写与重载,对象相等的判断, hashCode 与 equals

文章目录 2.1 面向对象三大特性2.1.1 封装 继承 多态2.1.2 其中Java 面向对象编程三大特性&#xff1a;封装 继承 多态2.1.3 关于继承如下 3 点请记住&#xff1a;2.1.4 什么是多态机制&#xff1f;Java语言是如何实现多态的&#xff1f;2.1.5 Java实现多态有三个必要条件&…

H5ke12--2--学生选课表格的编辑

方法1不可以修改的用label,如何按了哪一行 就会在下面有个文本显示可编辑的一行 方法2每一行后面都有一个编辑, 3对每一个修改,每一个td失去焦点都会有,直接到达我们服务器 注意 如果用span的每一个html元素都可以自己定义属性 Data-属性名,data-Address links也要给为span 1…

Qt学习(2)

1.QObject 只有继承了QObject类的类&#xff0c;才具有信号槽的能力。所以&#xff0c;为了使用信号槽&#xff0c;必须继承QObject。凡是QObject类&#xff08;不管是直接子类还是间接子类&#xff09;&#xff0c;都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽&…

【LeetCode】挑战100天 Day14(热题+面试经典150题)

【LeetCode】挑战100天 Day14&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-162.1 题目2.2 题解 三、面试经典 150 题-163.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

nohup 实现远程运行不关机操作

nohup 实现远程运行不宕机操作 python nohup 实现远程运行不宕机操作 - python教程网 远程运行最怕断电&#xff0c;训练了几个小时的数据说没就没&#xff0c;或者停止运行。 用nohup 记录代码的输出&#xff0c;还可以不受断电的影响。 方法 1. 用nohup 运行一个python文…

HTML网站稳定性状态监控平台源码

这是一款网站稳定性状态监控平台源码&#xff0c;它基于UptimeRobot接口进行开发。当您的网站遇到故障时&#xff0c;该平台能够通过邮件或短信通知您。下面是对安装过程的详细说明&#xff1a; 安装步骤 将源码上传至您的主机或服务器&#xff0c;并进行解压操作。 在Uptim…

Redis高并发缓存架构

前言&#xff1a; 针对缓存我们并不陌生&#xff0c;而今天所讲的是使用redis作为缓存工具进行缓存数据。redis缓存是将数据保存在内存中的&#xff0c;而内存的珍贵性是不可否认的。所以在缓存之前&#xff0c;我们需要明确缓存的对象&#xff0c;是否有必要缓存&#xff0c;怎…

C++之模版初阶(简单使用模版)

前言 在学习C的模版之前&#xff0c;咱们先来说一说模版的概念&#xff0c;模版在我们的日常生活中非常常见&#xff0c;比如我们要做一个ppt&#xff0c;我们会去在WPS找个ppt的模版&#xff0c;我们只需要写入内容即可&#xff1b;比如我们的数学公式&#xff0c;给公式套值&…

DBS note5:Relational Algebra(关系代数)

目录 一、关系代数简介 二、Projection () 三、Selection () 四、Union () 五、Set Difference (-) 六、Intersection () 七、Cross Product () 八、Joins () 九、Rename () 十、Group By / Aggregation () 一、关系代数简介 关系代数中的所有运算符都接受一个关系并…

mac上Homebrew的安装与使用

打开终端&#xff1a;command空格 &#xff0c;搜索‘’终端 ’&#xff0c;打开终端 在终端中输入以下命令并按下回车键&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个命令会自动下载并安装…