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) 的关键,用于解决事务执行过程中的并发竞争问题。

工作原理:

  1. 客户端使用 **WATCH key [key ...] **命令监视一个或多个键。

  2. 在 **MULTI **和 **EXEC **之间准备事务命令。

3.当执行 **EXEC **时:

  • 如果被 WATCH 的键从被监视开始到 EXEC 执行之前被其他客户端修改过,那么当前客户端的事务将执行失败,返回 (nil)

  • 如果没有被修改,事务将正常执行

posted @ 2025-08-28 10:49  蒟蒻00  阅读(16)  评论(0)    收藏  举报