分布式锁
你有没有想过这个问题:
单机环境下,synchronized 和 ReentrantLock 足够。
但如果是集群部署呢?多台机器同时抢一把锁,怎么保证互斥?
单机锁解决的是进程内的问题,分布式锁解决的是跨机器的问题。
模块速览
分布式锁是分布式系统中最重要的基础设施之一。
| 章节 | 篇数 | 核心内容 |
|---|---|---|
| 分布式锁基础 | 1 篇 | 五大要求:互斥、可重入、不死锁、公平性、高性能 |
| Redis 分布式锁 | 8 篇 | SETNX、Redisson、看门狗、公平锁、读写锁、联锁 |
| 其他实现方案 | 3 篇 | MySQL 唯一索引、ZooKeeper 临时顺序节点、对比选型 |
五大要求
分布式锁必须满足以下五个条件:
1. 互斥性:在任意时刻,只有一个客户端持有锁
2. 不会死锁:即使客户端崩溃,锁也能被释放(TTL / Lease)
3. 可重入:同一个客户端可以多次获取同一把锁
4. 公平性(可选):锁按请求顺序分配(FIFO)
5. 高性能:获取 / 释放锁的操作必须快实现方案对比
| 方案 | 性能 | 可靠性 | 实现复杂度 | 适用场景 |
|---|---|---|---|---|
| Redis SETNX | 最高 | 中 | 中 | 高性能场景 |
| Redisson | 高 | 高 | 低 | 推荐使用 |
| ZooKeeper | 中 | 高 | 高 | 高可靠性场景 |
| MySQL | 低 | 高 | 低 | 备选方案 |
| etcd | 中 | 高 | 中 | K8s 生态 |
面试高频问题
Q1:Redis 分布式锁如何实现可重入?
「Redis Hash 结构存储锁信息:key=锁名,field=持有者 ID,value=重入计数。 获取锁时,如果是自己持有则计数+1 并续期;否则尝试获取锁。 释放锁时,计数归零才真正删除锁。」
Q2:Redisson 的看门狗机制是什么?
「看门狗解决的是「锁 TTL 到了但业务还没执行完」的问题。 Redisson 默认每 10 秒自动续期一次(internalLockLeaseTime / 3)。 只要持有锁的业务还在运行,看门狗就会一直续期。 业务执行完毕后释放锁,看门狗自动停止。」
Q3:Redis 分布式锁超时了怎么办?
「锁超时的本质是:业务执行时间 > 锁 TTL。 解决方案有三个:
- 合理评估 TTL + 看门狗续期
- 任务设计为可中断的,分段执行
- 锁值中携带预期完成时间,检查任务是否超时再继续」
延伸阅读
分布式锁的选择建议:
- Redis:首选方案,推荐使用 Redisson,性能最高
- ZooKeeper:金融、配置等高可靠性场景
- MySQL:作为备选或过渡方案
记住:没有最好的方案,只有最合适的方案。
