【Redis】Transaction(事务)

news2024/9/20 22:02:16

🎯前言

Redis事务是一个组有多个Redis命令的集合,这些命令可以作为一个原子操作来执行。

Redis事务通常用于以下两种情况:

  1. 保证操作的原子性:在多个命令的执行过程中,如果有一个命令执行失败,整个事务都需要回滚(撤销)到事务开始前的状态,确保数据的一致性。

  2. 实现乐观锁:通过在事务中监视某些键,如果这些键在事务执行之前被其他客户端修改,则事务可以取消执行,从而避免了出现死锁或数据不一致的情况。

在Redis中,通过使用MULTI命令开始一个事务,然后将多个命令添加到事务中,最后使用EXEC命令来执行这些命令。如果事务中的任何一个命令执行失败,可以使用DISCARD命令来取消事务,或者使用UNWATCH命令来取消对键的监视。

Redis的与事务相关的命令说明:

  1. DISCARD:用于取消一个事务,放弃事务中所有未执行的命令,并恢复到事务开始前的状态。
  2. EXEC:用于执行一个事务,将所有已组装但未执行的命令一次性执行,并返回执行结果。
  3. MULTI:用于组装一个事务,将多个命令放入事务中,等待后续的EXEC命令来执行这些命令。
  4. UNWATCH:用于取消对所有键的监视,这个命令通常在使用WATCH命令监视一些键时使用,以确保在执行事务之前,这些键没有被其他客户端修改。
  5. WATCH:用于监视一些键,一旦这些键在事务执行之前被改变,则取消事务的执行。这个命令通常与MULTI命令一起使用,用于实现类似于"乐观锁"的效果。

这些命令通常用于保证在Redis事务中的操作的原子性和一致性。通过将多个命令放入同一个事务中,可以确保这些命令作为一个整体一起执行,并且在有其他客户端对被监视的键进行修改时,能够适当地处理冲突和错误。

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  1. 批量操作在发送 EXEC 命令前被放入队列缓存。
  2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  1. 开始事务。
  2. 命令入队。
  3. 执行事务。

🎯DISCARD(取消事务,放弃执行事务块内的所有命令)

说明:

  • DISCARD命令是Redis事务的一部分,用于取消当前事务,恢复到事务开始前的状态。
  • 使用DISCARD命令可以在事务执行过程中取消事务,并且不会对已有的键值产生影响。

时间复杂度:

  • O(1)。

返回值:

  • 总是返回 OK 

以下是一个使用DISCARD命令的示例代码:

127.0.0.1:6379> multi # 开始一个事务
OK
127.0.0.1:6379> set key1 "value1" # 添加一个SET命令到事务中
QUEUED
127.0.0.1:6379> set key2 "value2" # 添加另一个SET命令到事务中 
QUEUED
127.0.0.1:6379> discard # 取消事务,不执行SET命令
OK
  • 在这个示例中,通过使用DISCARD命令,第一个SET和第二个SET命令不会生效,并且整个事务都被取消了。
  • 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
  • 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

🎯EXEC(执行所有事务块内的命令)

说明:

  • EXEC命令是Redis事务的一部分,用于执行事务中所有添加的命令。
  • 当使用EXEC命令时,事务中的所有命令将作为一个原子操作被执行,如果有一个命令执行失败,整个事务将回滚到开始前的状态。
  • 举例:假如某个(某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断终止。

时间复杂度:

  • 事务块内所有命令的时间复杂度的总和。

返回值:

  • 事务块内所有命令的返回值,按命令执行的先后顺序排列。
  • 当操作被打断时,返回空值 nil 。

以下是一个使用EXEC命令的示例代码:

# 事务被成功执行


127.0.0.1:6379> MULTI
OK


127.0.0.1:6379> INCR userid
QUEUED


127.0.0.1:6379> INCR userid
QUEUED


127.0.0.1:6379> INCR userid
QUEUED

redis> PING
QUEUED

redis> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG


# 监视 key ,且事务成功执行

127.0.0.1:6379> WATCH lock lock_value
OK

127.0.0.1:6379> MULTI
OK

127.0.0.1:6379> SET lock "xiaojian"
QUEUED

127.0.0.1:6379> INCR lock_value
QUEUED

127.0.0.1:6379> EXEC
1) OK
2) (integer) 1


# 监视 key ,且事务被打断

127.0.0.1:6379> WATCH lock lock_value     # 监视lock键 和 lock_value键
OK

127.0.0.1:6379> MULTI     # 开始一个事务
OK

127.0.0.1:6379> SET lock "mr"        # 就在这时,另一个客户端修改了 lock 键的值,另一个客户端修改 这个被监视的 lock键,此时事务必定是失败的!
QUEUED

127.0.0.1:6379> SET lock_value    # 此时就算 lock_value 没被修改,事务失败已成定局。
QUEUED

127.0.0.1:6379> EXEC                  # 因为 lock 被其他客户端修改,事务自动取消执行。
(nil)

🎯MULTI(标记一个事务块的开始)

说明:

  • MULTI命令是Redis事务的一部分,用于开始一个新事务,并将后续的命令添加到这个事务中,直到使用EXEC命令执行这些命令为止。
  • 事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
  • 使用MULTI命令可以将多个命令添加到事务中,并且可以在需要时使用DISCARD命令取消事务,或者使用EXEC命令执行事务中的所有命令。

时间复杂度:

  • O(1)。

返回值:

  • 返回 OK 。

以下是一个使用MULTI命令的示例代码:

127.0.0.1:6379> multi # 标记事务开始
OK
127.0.0.1:6379> set key1 value1  # 多条命令按顺序入队
QUEUED
127.0.0.1:6379> set key2 valus2
QUEUED
127.0.0.1:6379> exec # 执行
1) OK
2) OK



  • 在这个示例中,通过使用MULTI命令,将两个SET命令添加到事务中,使用EXEC命令执行事务中的所有命令。或者可以使用DISCARD命令取消事务,这样两个SET命令都不会被执行。
  • MULTI命令是Redis事务的一个重要组成部分,用于开始一个新事务并将后续的命令添加到这个事务中。

🎯UNWATCH(取消 WATCH 命令对所有 key 的监视)

说明:

  • UNWATCH命令是Redis事务的一部分,用于取消对所有键的监视,这个命令通常在使用WATCH命令监视一些键时使用,以确保在执行事务之前,这些键没有被其他客户端修改。
  • 当使用UNWATCH命令时,Redis将取消对所有键的监视,如果有其他客户端在这些键上执行了修改操作,也不会影响当前客户端的事务执行。
  • 如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。
  • 因为 EXEC 命令会执行事务,因此 WATCH 命令的效果已经产生了;而 DISCARD 命令在取消事务的同时也会取消所有对 key 的监视,因此这两个命令执行之后,就没有必要执行 UNWATCH 了。

时间复杂度:

  • O(1)。

返回值:

  • 总是 OK 。

以下是一个使用UNWATCH命令的示例代码:

127.0.0.1:6379> WATCH lock lock_value
OK

127.0.0.1:6379> UNWATCH
OK

🎯WATCH(监视一个或多个key ,在事务执行之前这个或这些 key 被其他命令所改动,那么事务将被打断)

说明:

  • WATCH命令是Redis事务的一部分,用于监视一些键,一旦这些键在事务执行之前被其他客户端修改,则事务会取消执行,从而避免了出现死锁或数据不一致的情况。
  • 当使用WATCH命令时,客户端将开始监视指定的键,如果这些键在其他客户端上被修改,当前客户端的事务将自动取消执行。

时间复杂度:

  • O(1)。

返回值:

  • 总是返回 OK 。

以下是一个使用WATCH命令的示例代码:

127.0.0.1:6379> watch key1  # 监视一个键  (注意:可以一条命令监视多个键  如:WATCH key1 key2)

127.0.0.1:6379> watch key2  # 再监视一个键  

127.0.0.1:6379> multi # 开始一个事务  

127.0.0.1:6379> set("key1", "value1")  # 在被监视的键上进行SET操作  

127.0.0.1:6379> set("key2", "value2")  # 在被另外
  • 当使用WATCH命令监视了两个键后,开始一个新事务,并在被监视的键上执行SET操作,如果这些键在其他客户端上被修改,事务会自动取消执行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据编制架构】数据编织(Data fabric)架构完整指南

本文探讨了 Data Fabric 的内容、原因、方式和人员,包括 Data Fabric 架构、挑战、优势、核心功能、供应商等。 Data Fabric——以数据为中心的企业的“必备” 在过去几年中,“Data Fabric”一词已成为企业数据集成和管理的代名词。分析公司 Gartner 将“…

vtkButtonWidget Window 添加按钮

有时我们需要在 VTK 窗口中增加 按钮&#xff0c;右上角&#xff1b; 实现&#xff0c;通过回调函数&#xff0c;vtkButtonCallback 获取点击&#xff1a; #include <vtkVersion.h> #include <vtkSmartPointer.h>#include <vtkPolyDataMapper.h> #include &…

Java性能权威指南-总结27

Java性能权威指南-总结27 数据库性能的最佳实践Java集合类API同步还是非同步设定集合的大小 集合与内存使用效率 数据库性能的最佳实践 Java集合类API Java的集合类API有很大的选择余地&#xff1b;Java 7至少提供了58个不同的集合类。在编写应用时&#xff0c;选择恰当的集合…

数据结构算法题——数组

leetcode-1.两数之和 leetcode-1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在…

阿里云AliYun物联网平台使用-申请免费试用及完成初始配置

一、项目简介 本专栏文章将围绕阿里云物联网平台&#xff0c;实现其设备向云平台的数据上传&#xff0c;客户端获取云平台数据。设备通过NBIOT技术实现无线采集&#xff0c;定时上传。 二、阿里云平台申请 阿里云物联网平台试用申请地址 进入上述超链接网址&#xff1a; 由于是…

【InnoDB 存储引擎】15.7.1 InnoDB Locking(锁实验,包含了如 记录锁、间隙锁、Next-Key Lock 算法等,重要)

文章目录 1 关于 Record Lock 的实验1.1 实验 1&#xff1a;没有主键时的如何锁定1.2 实验 1&#xff08;续&#xff09;&#xff1a;带着问题继续实验1.3 实验 2&#xff1a;有主键时如何锁定 2 关于 Next-Key Lock 的实验2.1 实验 3&#xff1a;如何确定算法的锁定范围2.2 实…

VS 字体不对齐解决方案

1. 问题描述 输入相同数量但不是同一类型的字符的字符&#xff0c;会出现字符显示不对齐的问题。 在某些需要根据对齐来写的代码的时候&#xff0c;这种情况是相当的折磨。 2. 解决方案 设置等宽字体。 依次点击 VS 上方的 工具 → 选项 → 字体和颜色 → 字体 → 随便选择一款…

基于simulink识别彩色视频序列中的交通警告标志

一、前言 此示例演示如何识别彩色视频序列中的交通警告标志&#xff0c;如“停止”、“请勿进入”和“让行”。 二、模型 下图显示了交通警告标志识别模型&#xff1a; 三、交通警告标志模板 该示例使用两组模板 - 一组用于检测&#xff0c;另一组用于识别。 为了节省计算…

Linux常用命令——ex命令

在线Linux命令查询工具 ex 启动vim编辑器的ex编辑模式 补充说明 在ex模式下启动vim文本编辑器。ex执行效果如同vi -E&#xff0c;适用于法及参数可参照vi指令&#xff0c;如要从Ex模式回到普通模式&#xff0c;则在vim中输入:vi或:visual即可。 语法 ex&#xff08;参数&…

【算法设计与分析】集合相等问题——设计一个拉斯维加斯算法,对于给定的集合S和T,判定其是否相等。

目录 一、问题描述二、问题分析三、运行结果四、源代码 一、问题描述 给定两个集合S和T&#xff0c;试设计一个判定S和T是否相等的蒙特卡洛算法。 数据输入&#xff1a; 由文件input.txt给出输入数据。第1行有1个正整数n&#xff0c;表示集合的大小。接下来的2行&#xff0c;每…

路径规划算法:基于梯度优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于梯度优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于梯度优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法梯度…

关于线程池其他一些知识点的讨论

文章目录 前言一、线程池的几种任务队列1.ArrayBlockingQueue2.LinkedBlockingQueue3.DelayedWorkQueue4.SynchronousQueue 二、如何确定核心线程数&#xff1f;三、线程池的种类有哪些&#xff1f;1.newFixedThreadPool2.newSingleThreadExecutor3.newCacheThreadPool4.newSch…

AI掌绘艺术:揭秘Stable Diffusion华美图韵背后那些提示词的秘密

开篇 好了好了&#xff0c;我知道这个标题有点大&#xff0c;大得像我妈的锅一样。但是&#xff0c;我保证&#xff0c;当你读完这篇文章后&#xff0c;你不仅会明白我为什么敢用这样的标题&#xff0c;而且你也会想试试宝贵的AI画画方法。 首先&#xff0c;我要说&#xff0…

【ARM Coresight 系列文章 3.1 - ARM Coresight DP 对 AP 的访问 1】

文章目录 1.1 DP 中相关寄存器的介绍1.1.1 DPACC and APACC 寄存器1.1.2 DP SELECT 寄存器1.1.3 AP CSW寄存器1.1.4 AP TAR 寄存器1.1.5 AP DRW寄存器1.1.6 AP Banked Data registers 1.1 DP 中相关寄存器的介绍 如果DAP接入的是JTAG接口&#xff0c;那么将会通过APACC寄存器来…

idea中非常好用的配置

1、自动导包和优化多余的包 2、显示行号、方法之间的分隔符 3、忽略大小写进行提示 4、多个类不隐藏&#xff0c;多行显示 5、鼠标悬浮代码提示 6、加入类之前的稳定注释模板 好了&#xff0c;文章就分享到这里了&#xff0c;看完之后如果对你有所帮助&#xff0c;不要忘了点赞…

【机器学习核心总结】什么是长短时记忆网络(LSTM)

什么是长短时记忆网络(LSTM) RNN有一定的记忆能力&#xff0c;但不幸的是它只能保留短期记忆&#xff0c;在各类任务上表现并不好&#xff0c;那该怎么办? 人们将目光投向了自己&#xff0c;人类的记忆是有取舍的&#xff0c;我们不会记住每时每刻发生的所有事&#xff0c;会…

学无止境·MySQL④(多表查询)

多表查询试题 试题一1、创建表2、表中添加数据3、查询每个部门的所属员工4、查询研发部门的所属员工5、查询研发部和销售部的所属员工6、查询每个部门的员工数,并升序排序7、查询人数大于等于3的部门&#xff0c;并按照人数降序排序 试题一 1、创建表 use mydb3; – 创建部门…

技术文本的写作问题

最近刚参与一位大佬的重要文本撰写&#xff0c;也就3000字&#xff0c;磨了有几个月。 收获很多。关于技术写作&#xff0c;要写透&#xff0c;要写简单&#xff1b;要舍得放弃。 写透看起来简单&#xff0c;其实是最难的。一般人看到有字数限制就拼命压缩文本&#xff0c;把…

从零开始制作一个Web蜜罐扫描器(1)

从零开始制作一个Web蜜罐扫描器(0)_luozhonghua2000的博客-CSDN博客 蜜罐有什么特征 根据我们上面的描述,现在可以理解,蜜罐的功能是诱捕黑客. 诱捕黑客是利用的jsonp劫持技术来做。 jsonp劫持技术需要利用jsonp跨域请求很多其他的社交网站页面从而获得攻击者的相关信息。 因…

SpringBoot第20讲:SpringBoot如何对接口进行签名

SpringBoot第20讲&#xff1a;SpringBoot如何对接口进行签名 在以SpringBoot开发后台API接口时&#xff0c;会存在哪些接口不安全的因素呢&#xff1f;通常如何去解决的呢&#xff1f;本文是SpringBoot第20讲&#xff0c;主要介绍API接口有不安全的因素以及常见的保证接口安全的…