Skip to content
极高困难

一句话答案

SETNX + 过期时间 + Lua 保证原子性,生产用 Redisson(Watch Dog 续期 + 可重入),注意主从切换时锁丢失。

核心要点
维度Redis 分布式锁ZooKeeper 分布式锁
实现原理SETNX + 过期时间临时顺序节点 + Watch 机制
一致性AP(可能短暂不一致)CP(强一致,ZAB 协议)
性能高(内存操作,单次命令)低(磁盘 IO,Zab 协议同步)
锁释放依赖 TTL 过期(可能有短暂延迟)客户端断开自动删除临时节点(更可靠)
公平性非公平(所有客户端竞争)公平(顺序节点保证 FIFO)
脑裂风险有(主从切换期间)低(多数派选举,不会双主)
适用场景对性能要求高,可接受极小概率失效对正确性要求极高(金融、关键资源)

六、一致性与集群

追问与易错

追问方向:

  • 锁过期了但业务没执行完怎么办?(Watch Dog 续期/Redisson 自动续期)
  • 主从切换时锁会丢失吗?怎么解决?(会,RedLock 方案/但有争议)
  • 可重入锁怎么实现的?(Hash 结构存线程标识+重入次数)

易错点:

  • ❌ "SETNX + EXPIRE 两条命令"——不是原子操作!用 SET key val NX EX 一条
  • ❌ "加了过期时间就安全了"——业务超时仍可能导致并发问题

💡 记忆锚点

分布式锁三要素口诀:SET NX EX一条搞定(原子加锁),UUID防误删(只能自己开自己的锁),Watch Dog自动续期(防业务没跑完锁先没了)。记住:主从切换是阿喀琉斯之踵,金融场景考虑ZK。