Redis如何实现乐观锁的

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

一、核心前提:Redis乐观锁的底层逻辑

乐观锁的核心是不加锁、无阻塞,仅在最终提交操作时校验数据是否被并发修改:若数据未变则执行更新,若已被篡改则放弃本次操作并重试,避免线程阻塞。

Redis没有内置的乐观锁API,而是通过WATCH命令 + 事务(MULTI/EXEC)实现CAS(比较并交换)机制,这是Redis实现乐观锁的唯一标准方案。

核心原理:WATCH监控目标键的变更状态,事务提交前若键被修改,事务直接放弃执行,以此实现并发冲突校验。

二、核心命令详解

实现乐观锁需要配合4个关键命令,各司其职完成监控、事务、提交全流程:

  • WATCH key [key ...]:开启键监控,标记指定键为“受监控状态”。一旦监控的键被其他客户端修改(增删改),当前客户端的事务会被打断。
  • MULTI:开启事务队列,后续命令不会立即执行,而是存入事务队列缓存。
  • EXEC:提交事务,批量执行队列中的命令。若监控键被修改,EXEC返回nil,事务不执行;若未修改,正常执行所有命令。
  • UNWATCH:取消所有键的监控,常用于事务执行失败后重置状态。

Redis事务不支持回滚!EXEC执行前若监控键被篡改,事务直接丢弃,而非回滚,这是实现乐观锁的关键特性。

三、分步实现流程(以库存扣减为例)

以经典的商品库存并发扣减场景,拆解Redis乐观锁的完整执行步骤:

步骤1:监控目标库存键

客户端执行WATCH命令,监控库存键(如stock:1001),此时Redis会记录该键的当前版本/状态。

步骤2:读取当前数据,执行业务校验

客户端获取库存键的当前值,判断是否满足操作条件(如库存是否充足)。这一步是非原子的,允许并发读取

步骤3:开启事务,编写修改命令

执行MULTI开启事务,将库存扣减命令(如DECRBY)加入事务队列,此时命令仍未执行。

步骤4:提交事务,触发CAS校验

执行EXEC提交事务,Redis会原子性校验:监控的stock:1001是否被其他客户端修改。

  • 校验通过:执行队列中的扣减命令,返回执行结果。
  • 校验失败:EXEC返回nil,事务丢弃,客户端需重试整个流程。

步骤5:失败重试/取消监控

若事务执行失败,先执行UNWATCH取消监控(避免影响后续操作),再重新发起WATCH+事务流程。

四、实战命令行演示

场景:商品1001初始库存100,两个客户端并发扣减库存

客户端A(正常执行)

# 1. 监控库存键
WATCH stock:1001
# 2. 读取当前库存(返回100)
GET stock:1001
# 3. 开启事务,加入扣减命令
MULTI
# 扣减1件库存
DECRBY stock:1001 1
# 4. 提交事务
EXEC
# 执行结果:返回99(库存扣减成功)

客户端B(并发冲突,执行失败)

# 1. 监控库存键
WATCH stock:1001
# 2. 读取当前库存(返回100,此时客户端A尚未提交)
GET stock:1001
# 3. 开启事务,加入扣减命令
MULTI
DECRBY stock:1001 1
# 4. 提交事务前,客户端A已修改库存,触发冲突
EXEC
# 执行结果:返回nil(事务放弃,扣减失败)
# 5. 取消监控,准备重试
UNWATCH
    

五、关键注意事项

  • 监控粒度:WATCH可监控多个键,仅当所有监控键均未修改时,事务才会执行;任意键修改,事务直接失效。
  • 监控失效场景:客户端断开连接、执行UNWATCH、执行EXEC/DISCARD(事务提交/丢弃),都会自动取消监控。
  • 非值变更也会触发失效:DEL、RENAME、EXPIRE等修改键结构/状态的命令,也会触发WATCH监控失效。
  • 必须加重试机制:并发冲突时事务会失败,必须设置重试次数,避免单次操作直接报错。
  • 不适合高并发冲突场景:若并发冲突极高,重试次数会激增,性能下降,此时建议改用分布式锁(如Redlock)。

六、适用场景

Redis乐观锁适合读多写少、并发冲突概率低的场景,比如:

  • 商品库存扣减、优惠券核销
  • 用户积分、余额变更
  • 配置信息、计数更新

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Redis分布式锁 文章被收录于专栏

本专栏聚焦 Redis 分布式锁从原理到生产落地全流程,拆解SET 原子加锁、Lua 解锁、锁续期、Redlock等核心技术,直击锁超时、误释放、主从一致性等高频痛点。结合 Redisson 实战与微服务场景案例,输出可直接复用的代码方案与避坑指南,助力后端工程师攻克分布式并发难题,构建高可靠锁服务。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
12545次浏览 110人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7837次浏览 43人参与
# MiniMax求职进展汇总 #
24407次浏览 312人参与
# 你的实习产出是真实的还是包装的? #
2222次浏览 44人参与
# 简历第一个项目做什么 #
31885次浏览 348人参与
# 长得好看会提高面试通过率吗? #
1329次浏览 27人参与
# 巨人网络春招 #
11414次浏览 224人参与
# 重来一次,我还会选择这个专业吗 #
433703次浏览 3926人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187422次浏览 1123人参与
# 牛客AI文生图 #
21472次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152675次浏览 888人参与
# 研究所笔面经互助 #
119010次浏览 577人参与
# 简历中的项目经历要怎么写? #
310640次浏览 4237人参与
# AI时代,哪些岗位最容易被淘汰 #
64211次浏览 847人参与
# 面试紧张时你会有什么表现? #
30538次浏览 188人参与
# 你今年的平均薪资是多少? #
213368次浏览 1039人参与
# 你怎么看待AI面试 #
180424次浏览 1277人参与
# 高学历就一定能找到好工作吗? #
64353次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76774次浏览 374人参与
# 我的求职精神状态 #
448264次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363876次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160752次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务