首页/数据/数据库速查/WATCH 乐观锁(CAS 与重试)
Redis 运维与场景124 条

WATCH 乐观锁(CAS 与重试)

WATCH 监视若干 key;若在 EXEC 前任一 key 被其他客户端修改,EXEC 返回 nil 表示事务放弃,客户端需重读重试——即 CAS/乐观锁模式。

数据库速查数据更新于 2026-10-12

CAS 扣库存

CAS 扣库存
WATCH stock:1001
GET stock:1001          # 读到 5,客户端判断可扣
MULTI
DECRBY stock:1001 1
EXEC                    # 若期间 stock:1001 被改 -> (nil),回到 WATCH 重试
生命周期WATCH 的监视在 EXEC/UNWATCH/连接关闭后清除
失败语义EXEC 返回 nil = 有人改过,什么都没执行
重试由应用负责循环:重读->重算->重试,限制次数防饿死
高竞争场景 WATCH 重试率高,不如 Lua 一把梭;WATCH 优点是不需要写脚本、逻辑在客户端更直观。

易错点

  • 监视的 key 被自己改也会触发:重试逻辑要覆盖自己写回的路径
  • 不设重试次数上限:高并发下 CPU 空转

数据来源与参考

  • Redis 官方文档: WATCH
  • Redis 官方文档: Transactions

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌