redis支持事务吗,怎么支持的
Redis 事务的核心机制是:命令打包、顺序执行、乐观锁辅助。它不提供原子性回滚(Rollback)
核心实现机制
Redis 通过四个命令 MULTI, EXEC, DISCARD, WATCH 和一个关键的设计——事务队列来实现事务。
事务队列
-
当客户端执行 MULTI 命令后,Redis 会将这个客户端的状态切换为事务状态。
-
在此状态下,该客户端发送的所有非事务控制命令(如 SET, GET, SADD, HSET 等)都不会被立即执行,而是被服务器放入一个名为 事务队列(FIFO队列) 的内存结构中。
-
服务器对每个入队的命令只回复一个 QUEUED,表示命令已成功加入队列。
执行阶段:EXEC
-
当客户端发送 EXEC 命令时,服务器会退出该客户端的事务状态。
-
Redis 的单线程事件循环会从队列中取出所有命令,然后依次、连续、不间断地执行它们。
-
所有命令的执行结果会被收集起来,最后以一个数组的形式返回给客户端。
放弃事务:DISCARD
-
如果客户端在 MULTI 之后、EXEC 之前决定放弃本次事务,可以发送 DISCARD 命令。
-
Redis 会清空该客户端的事务队列,并将其状态切换回非事务状态。
错误处理
入队时错误(语法错误等)
- 如果在将命令放入队列时发现错误(例如,命令不存在、参数数量错误),Redis 会记住这个错误。
- 当执行 EXEC 时,整个事务都会被拒绝,队列中的所有命令都不会执行。
运行时错误(执行时错误)
- 命令在入队时语法正确,但在执行时出错(例如,对字符串类型的键执行 SADD 操作)。
- Redis 会忽略这个错误,继续执行队列中的后续命令。之前和之后的命令都会正常执行。
使用 WATCH 实现乐观锁(CAS)
WATCH 是 Redis 实现乐观锁(Optimistic Locking) 的关键,用于解决事务执行过程中的并发竞争问题。
工作原理:
-
客户端使用 **WATCH key [key ...] **命令监视一个或多个键。
-
在 **MULTI **和 **EXEC **之间准备事务命令。
3.当执行 **EXEC **时:
-
如果被 WATCH 的键从被监视开始到 EXEC 执行之前被其他客户端修改过,那么当前客户端的事务将执行失败,返回 (nil)。
-
如果没有被修改,事务将正常执行。

浙公网安备 33010602011771号