外观
一句话答案
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。