【Redis】事务详解、WATCH 实现思想

Emscripten安装(wasm编译) 5:配置对应环境变量--替换成自己对应的安装路径(2025最新的Emscripten工具链默认使用LLVM/WebAssembly标准工作流,java依赖已经移除了,所以以下java环境不配,需要使用java的手动添加即可---->emsdk install java-8-152-64bit。3:下载相应的依赖库---->emsdk install latest(我这里下的是最新的,如果有指定版本,把latest替换成版本号即可)6:测试是否成功---> emcc- v/em++ -v。 阅读详情

事务

核心意义

Redis 事务的主要作用,是把多条命令“打包”为一组,然后按照顺序执行。它解决的核心问题不是像 MySQL 那样提供完整的强事务能力,而是在执行这一组命令时,尽量避免其他客户端的命令插入到这组操作中间。

可以先用一个生活例子理解。

你和朋友约好晚上去吃烧烤。你先到了烧烤店,点了牛肉串、羊肉串、五花肉等,但是你告诉服务员:

“我人还没齐,你先把单子记下来,先别急着烤。”

过了一会儿,朋友到了,又加了一些主菜和烤腰子。最后你说:

“好了,开始烤吧。”

这个过程里,前面点的和后面追加的菜,会被当成同一组订单一起处理。重点是:这组订单中间不会被别人插队。

对应到 Redis 事务里也是类似的:

MULTI        开启事务
命令1         进入队列
命令2         进入队列
命令3         进入队列
EXEC         执行事务

在 MULTI​ 之后、EXEC​ 之前,客户端发送的命令不会立刻执行,而是先进入事务队列。只有当 Redis 收到 EXEC 命令时,才会把队列里的命令按顺序执行。

对应图片:
​在这里插入图片描述

执行机制

再说说它的执行机制,Redis 事务的基本流程是:

客户端发送 MULTI -> Redis 开启事务状态 -> 后续命令进入队列,返回 QUEUED -> 客户端发送 EXEC -> Redis 按顺序执行队列中的命令 -> 返回执行结果

执行过程可以理解为:

MULTI:告诉 Redis,我要开始打包命令了
SET name lin:先别执行,放进队列
INCR count:先别执行,放进队列
EXPIRE name 60:先别执行,放进队列
EXEC:现在开始按顺序执行队列里的命令

在事务执行期间,Redis 会连续执行这组命令,中间不会穿插其他客户端的命令。这个特性和 Redis 的单线程命令执行模型有关。但是要注意,Redis 事务不是 MySQL 那种完整强事务。它更像是:

命令队列 + 顺序提交。

对应图片:
​

常用命令

Redis 事务相关的核心命令主要有 5 个

命令作用理解
​MULTI开启事务后续命令不立即执行,而是进入队列
​EXEC执行事务按顺序执行队列里的所有命令
​DISCARD取消事务清空事务队列,不执行
​WATCH监视 key用于实现乐观锁
​UNWATCH取消监视取消对 key 的监控
  • MULTI:开启事务

表示开启一个事务。

执行 MULTI 后,客户端再发送的命令会进入事务队列,而不是立刻执行。

MULTI
SET k1 v1
SET k2 v2

这时候 Redis 通常会返回:QUEUED,表示命令已经入队啦!没等到 EXEC 我是不会执行的!

  • EXEC:提交并执行事务

表示提交事务。

执行 EXEC 后,Redis 会把事务队列中的命令按照进入队列的顺序依次执行。

MULTI
SET name tom
INCR count
EXEC

真正修改数据的时间点不是 SET​ 和 INCR​ 发出时,而是 EXEC 发出之后。

  • DISCARD:取消事务

表示取消当前事务,并清空事务队列。

例如:

MULTI
SET name tom
INCR count
DISCARD

执行 DISCARD​ 后,前面入队的 SET name tom​ 和 INCR count 都不会执行。同时要注意,如果开启事务后,服务器突然挂了,重新启动事务就不存在咯,也相当于discard的效果!

  • WATCH:监视 key

用于监视一个或多个 key,常用来实现乐观锁。

基本思想是:

我先看一下这个 key 的值,然后准备修改它。如果在我提交事务之前,这个 key 被别人改过了,那我的事务就提交失败。

具体如何使用呢?在开启事务前watch一下key即可~

WATCH stock
GET stock
MULTI
DECR stock
EXEC

如果在 WATCH stock​ 之后、EXEC​ 之前,有其他客户端修改了 stock​,那么当前客户端的 EXEC 会失败。

  • UNWATCH:取消监视

用于取消对 key 的监视。通常当你不想继续执行当前事务逻辑时,可以使用它取消监控。

与 MySQL 事务的区别

它们不是一个级别的东西,Redis 事务更轻量、更简单;MySQL 事务更完整、更严格。

对比项Redis 事务MySQL 事务
定位命令打包 + 顺序执行完整数据库事务
原子性更像“整体提交,不被插队”,只强调全部执行强调真正的 all-or-nothing,确保全部都可以正确执行
回滚不支持 MySQL 那样的自动回滚支持回滚
隔离性依赖 Redis 单线程顺序执行,只是事务执行期间不被插队有完整隔离级别,如读已提交、可重复读等
一致性通常不作为强一致事务理解ACID 语义更完整
适用场景缓存、计数器、轻量批量更新订单、支付、转账等强事务业务

对应图片:
​在这里插入图片描述

原子性

这个地方很容易混乱,也是课堂板书里重点强调的地方。

单条 Redis 命令通常具有原子性

Redis 本身是单线程执行命令的,同一时刻只会处理一个命令。

所以像下面这种单条命令:

INCR count

它本身通常可以理解为原子操作。不会出现加到一半被其他命令插进来的情况。

Redis 事务的“原子性”比较弱

Redis 事务的原子性,不能完全按照 MySQL 的事务原子性理解。

Redis 事务可以做到一组命令按顺序执行,执行过程中不会被其他客户端命令插队

但是它做不到 MySQL 那种要么全部成功、要么失败后全部回滚,它只确认命令能全部执行,但不保证完全对~

这就是 Redis 事务和 MySQL 事务非常大的区别。

MySQL 的原子性更严格

MySQL 事务强调的是要么全部成功、要么全部失败,而且支持失败后可以回滚的功能

Redis 并没有实现这种功能,虽然这种功能强大,但也是需要一定的性能开销,所以 Redis 没有实现这种功能开发者可能也有一定的考虑~

WATCH 实现思想:乐观锁

详细来说,Redis 的 watch 是基于版本号这样的机制实现了乐观锁

版本号这个概念在 CAS 中的 ABA 问题也涉及过,其思想方法和实现方式上是十分相似的~

虽然说我之前的博客也有对乐观锁、CAS 和 ABA 问题有详细的讲解,但不影响阅读体验,就在这简略介绍下

在这里插入图片描述

什么是乐观锁?

乐观锁的想法是:

我先假设冲突不会发生,所以不提前把资源锁死;等真正提交时,再检查有没有被别人改过。

  • 悲观锁是:我觉得一定会有人抢,所以我先加锁。别人想操作,必须等我释放锁。

  • 乐观锁是:我觉得大概率不会冲突,所以大家都可以先操作,提交时再检查有没有冲突,如果冲突了,我就失败重试。

版本号

当执行watch key时,这时就会给 key 分配一个版本号,此处的版本号可以理解为“一个整数”,key 在每次修改后,版本号就会+1,此处假设 watch 之后 key 的版本号默认为1。

然后有两个客户端,客户端1执行了watch key,然后开启了事务,客户端2对key进行了更新操作,此时版本号+1。客户端1在队列中也安排了key的更新操作,然后客户端1 执行 exec,(exec 执行时间在客户端2对 key 更新操作之后)。此时 exec 在执行事务命令之后就会做出判定,判定watch时候的版本号与现在的版本号是否一致:如果一致,说明当前key在事务开启到最终执行的这个过程中都没有别的客户端进行修改,就能正常执行;反之,如果不一致,说明 key 在其他客户端就改过了,因此就丢弃了这个事务的操作,返回 nil ~

在这里插入图片描述

所以 watch 本质上不是给 key 上了一层字面意义上的 “锁”,而是观察 key 是否被改过!

它能解决一部分问题,但不能自动解决所有问题。

​MULTI/EXEC 能保证多条命令作为一组提交且按照顺序执行,执行过程中不被其他客户端命令插队

但是库存问题的关键通常不是简单地“几条命令一起执行”,而是先判断库存是否足够再决定要不要扣减

而 Redis 事务有一个限制:

事务中的命令是先入队,EXEC 时才执行。客户端不能在事务执行过程中,根据上一条命令的结果临时决定下一条命令是否执行。

也就是说,下面这种思路在 Redis 事务里不够安全

MULTI
GET stock
如果 stock > 0:
    DECR stock
EXEC

因为 GET stock​ 在 EXEC 前只是进入队列,并没有真正返回可用于客户端判断的结果。

所以,单靠 MULTI/EXEC 不适合处理复杂的“先读结果,再根据结果决定是否写”的业务。

在这里插入图片描述

STM32 IIC电量计LTC2944 LTC2944是一款电池电量计,设计用于端电压为3.6V至60V的多节电池。它测量电池充电和放电、电池电压、电流和自身温度。精密模拟库仑计数器通过电池正极端子与负载或充电器之间的检测电阻器对电流进行积分。电池电压、电池电流和硅温度由内部ADC测量。 阅读详情

相关推荐

springboot 启动方式 装配流程 自定义starter 文件加载顺序 常见设计模式

springboot 启动方式 装配流程 自定义starter 文件加载顺序 常见设计模式

sv 936

详解Redis之事务

详解Redis的事务,包括概念,特性,常用命令及使用演示。

. 1万+

普罗米修斯监控达梦数据库集群

-----------------------------------新增文件---------------------------------------注:图上即为启动成功,如果没有问题,则使用nohup后台启动程序。官网地址:https://github.com/gy297879328/dameng_exporter。注:prometheus的对数据库的指标采集如果高于60s一次,请手动修改提供表盘中的计算值。修改dameng_exporter.config配置文件,修改账号密码的部分。

weixin_49985403的博客 1679

Redis100篇 - Redis的事务进阶 Watch命令实现乐观锁

Redis事务进阶:Watch命令实现乐观锁 摘要 本文深入探讨Redis的Watch命令实现乐观锁机制,解决高并发场景下的数据一致性问题。文章首先分析Redis基础事务的局限性,包括不支持回滚和冲突检测,并通过库存超卖案例展示并发问题。然后详细讲解Watch命令的工作原理,采用乐观锁思想在事务执行前监视key变化。最后提供完整的Java+Spring Boot实战代码,演示如何实现带重试机制的库存扣减功能,包括项目配置、RedisTemplate使用和乐观锁实现细节。通过Mermaid流程图和并发对比图,

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

树莓派4B之OpenCV人脸识别实战:从Haar Cascade到实时检测(保姆级教程)

本教程详细介绍了如何在树莓派4B上部署OpenCV,并利用Haar Cascade算法实现实时人脸识别。内容涵盖从系统环境搭建、算法原理解析到代码逐行讲解与实战调优,为嵌入式AI和计算机视觉初学者提供了一份完整的保姆级实践指南。

p8q9r0的博客 401

VC Spyglass CDC实战:如何快速定位和解决重汇聚问题(附详细调试步骤)

本文深入探讨了在SoC设计中利用VC Spyglass进行CDC验证时,如何高效定位和解决棘手的重汇聚问题。通过实战演练,详细解析了重汇聚的本质、VC Spyglass的检测逻辑,并提供了从报告筛选、GUI原理图分析到制定设计修复或约束豁免方案的全套调试步骤,帮助工程师快速攻克这一常见验证难题。

weixin_29219539的博客 748

【redis】事务详解,相关命令multi、exec、discard 与 watch 的原理

事务的原子性、一致性、持久性、隔离性。与MySQL对比的优势和。事务的用处。事务的相关命令,multi、exec、discard、watch。watch的使用方法和实现原理

Yeeear的博客 2004

Intel网卡固件烧录实战:eeupdate与bootutil命令完全解析

固件作为硬件设备底层运行的软件,其稳定性直接决定硬件功能的完整性。网卡固件一旦损坏,常表现为MAC地址丢失、PXE启动失效、NVM数据异常导致降速或掉线。维护这类问题,需借助Intel官方工具eeupdate与bootutil在UEFI Shell或DOS环境下执行底层烧录操作。eeupdate负责网卡的身份信息与NVM存储管理,可重置MAC、恢复固件镜像;bootutil则专管启动行为,支持PXE配置与Boot Agent升级。从环境准备、命令参数到故障恢复,掌握这两款工具能让运维人员在修复存量网卡、应对

weixin_34269583的博客 311

redis的事务和watch机制

Redis 中的事务(transaction)是一个单独隔离的操作,保证两个或两个以上的命令集合按需排队并顺序执行,中间不会被任何其他操作打断。7)在 A 客户端查看 str.lp 值,A 客户端执行的事务没有提交,因为 WATCH 的 str.lp 的值已经被修改了, 所以放弃了事务。①watch 监视某个或者某几个key的值,如果有 key 的 value 值在事务 EXEC 执行之前被修改了,那么事务将被打断。①组队时出错,错误对于redis来说是已知的,事务中的所有指令都会失效。

baomingshu的博客 1733

用 YOLOv11‑Seg 做工地实例分割:从 0 起步到效果调优,真香!

这不是一篇“官方文档翻译”,而是一篇。

weixin_43199439的博客 776

【YOLOv12改进trick】高效多尺度卷积注意力EMCAD_Block模块引入YOLOv12,实现涨点和效率提升,含创新点Python代码

EMCAD引入YOLOv12模块,实现高效多尺度注意力模块引入到YOLOv12中的快速涨点及效率提升

向上生长的程序媛的博客 851

【进阶篇】2.6 Redis 事务详解

Redis 事务是一种将多个命令打包在一起执行的机制,可以保证这些命令的原子性,即要么全部执行成功,要么全部执行失败。开启事务在客户端执行 MULTI 命令时,Redis 会将该客户端标记为事务状态。此时,客户端发送的所有命令都会被暂存到一个事务队列中,而不是立即执行。执行事务在客户端执行 EXEC 命令时,Redis 会将客户端状态从事务状态中移除,并依次执行事务队列中的所有命令。在执行期间,Redis 会将事务队列中的命令全部执行完毕,而不会中途中断。

日拱一卒无有尽,功不唐捐终入海 7万+

C#实现每日定时执行制定程序(附完整源码)

C#实现每日定时执行制定程序(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 860

Redis事务详解

若对事务概念不清楚,请先阅读“彻底理解MySQL四种事务隔离级别”这篇文章,链接如下: 彻底理解MySQL四种事务隔离级别_YaoYong_BigData的博客-优快云博客 转入正题,结合关系型数据库的事务来看看Redis中事务有什么不同; Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会受客户端传入的命令请求影响。 Redis事务的相关命令如下: MULTI:标识一个事务的开启,即开启事务; EXEC:执行事务中的所有命令,即提...

大数据 9398

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis的watch机制详解

Redis 的WATCH机制为 Redis 提供了一种高效的乐观锁解决方案,允许客户端通过监视键的变化来控制并发事务的安全执行。它适用于高并发场景下的事务操作,同时能保持 Redis 的高性能特性。不过,在高冲突环境下,需要结合业务逻辑进行适当的重试或其他并发控制措施。

jkzyx123的博客 2501

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Redis 事务的实现详解

在数据库中,事务是一个逻辑操作单元,包含一组要么全部成功执行、要么全部失败的操作。事务通常满足ACID原子性:事务中的所有操作要么全部成功,要么全部失败回滚。一致性:事务执行前后,数据必须处于一致的状态。隔离性:多个事务之间相互独立,不会相互干扰。持久性:事务一旦提交,数据就会被永久保存。

lssffy的博客 1599

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Redis 事务的实现

目录 1事务的实现 1.1 事务开始 1.2 命令入队 1.3 事务队列 1.4 执行事务 2 WATCH 命令的实现 2.1 使用 WATCH 命令监视数据库键 2.2 监视机制的触发 2.3 判断事务是否安全 2.4 一个完成的 WATCH 事务执行过程 2.5 取消数据库键的监视 3 事务的 ACID 性质 3.1 原子性 3.2 一致性 3.3 隔离性 3.4 持久性 4 重点总结 Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(tran..

白开水的博客 3572

Redis事务使用方法 watch

Redis事务 Redis事务是一组命令的集合,也是Redis的最小执行单位之一。一个事务的所有命令,要么都执行,要么都不执行。Redis能保证事务执行期间不会有其他命令插入。 相关命令 命令 格式 说明 DISCARD DISCARD 取消事务 EXEC EXEC 执行事务中的命令 MULTI MULTI 标记一个事务...

u010412301的博客 2407

Redis的事务功能详解

Redis的事务功能详解 MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 > 在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。因此,Redis事务能够保

hjh15827475896的博客 2137

Redis watch命令——监控事务

当 Redis 使用 exec 命令执行事务的时候,它首先会去比对被 watch 命令所监控的键值对,如果没有发生变化,那么它会执行事务队列中的命令,提交事务;无论事务是否回滚,Redis 都会去取消执行事务前的 watch 命令,这个过程如图 1 所示。,而只是通过比较 watch 监控的键值对去保证数据的一致性,所以 Redis 多个事务完全可以在非阻塞的多线程环境中并发执行,而且 Redis 的机制是不会产生 ABA 问题的,这样就有利于在保证数据一致的基础上,提高高并发系统的数据读/写性能。

springdk2009的博客 1030

Redis之事务的实现

Redis事务和数据库的事务严格意义来说是不一样的,Redis的事务是通过一组命令的集合,Redis事务提供了一种将多个命令请求打包,然后一次性的、按顺序的执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去执行其他客户端的命令请求。 Redis 通过 MULTI(标记一个事务块的开始) 、 EXEC(执行) 、DISCARD(放弃执行事务块内的所有命令)和 WATCH(乐观锁) 四个命令来实现事务功能。一个事务从开始到结束通常会

程铭程铭你快成名的博客 1万+

【Redis】聊一下Redis事务以及watch机制

聊一下Redis事务以及watch机制

芝兰生于深谷,不以无人而不芳 1626

Redis篇-3--原理篇2--Redis事务

Redis 提供了简单的事务机制,Redis 事务的本质是一组命令的集合。当执行redis事务时,即一次性按照添加顺序依次执行这些命令,中间不会被打断或者干扰。Redis 的事务机制并不像关系型数据库中的事务那样提供完整的ACID特性(原子性、一致性、隔离性和持久性),但它确实提供了一种方式来确保一组命令作为一个整体被执行。

weisian的博客 3万+

redis 事务实现原理

一:简介Redis事务通常会使用MULTI,EXEC,WATCH等命令来完成,redis实现事务实现的机制与常见的关系型数据库有很大的却别,比如redis的事务不支持回滚,事务执行时会阻塞其它客户端的请求执行。二:事务实现细节redis事务从开始到结束通常会通过三个阶段: 1.事务开始 2.命令入队 3.事务执行 我们从下面的例子看下 redis > MULTI OKre

bugall的专栏 9409

如何使用Redis Watch命令

如何使用Redis Watch命令 使用Redis管理数据,理解如何使用事务存储键值对数据很重要。Redis事务与RDMMS事务有些类似,但也有差异。Redis主要通过几个命令有效管理事务,本文讨论Redis的Watch命令以及如何使用。 1. 概述 在阅读之前你最好安装好Redis环境,熟悉Redis常用命令。 Redis事务命令主要包括 WATCH, EXEC, DISCARD, MULTI。这些命令构成一组命令块,确保在一个步骤中全部执行。首先,它们确保事务中的命令将按顺序执行并序列化。这意味着在执行

neweastsun的专栏 7885

Redis 事务,watch 监控(乐观锁)

文章目录一、事务二、watch 监控(乐观悲观锁) 视频链接 官网:https://redis.io/ 中文官网:http://redis.cn/ 一、事务 Redis 事务本质:一组命令的集合!一个事务中所有的命令都会被序列化,在事务中执行的过程,会按顺序执行! 一次性,顺序性,排他性!执行一系列命令! Redis 事务没有隔离级别的概念 所有的命令在事务中,并没有直接执行!只有发起执行命令 exec 的时候才会去执行 Redis 单条命令是保存原子性,但是事务不保存原子性 Redis 的事务: 开启事

不懂一休 1万+
上一篇: 【Redis】Docker 部署集群补充说明
下一篇: 【AI】Claude Code 迁移至 Codex 的工作流更新-v2
Jul1en_
博客等级 码龄2年 275粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值