Skip to content

分布式锁

你有没有想过这个问题:

单机环境下,synchronizedReentrantLock 足够。

但如果是集群部署呢?多台机器同时抢一把锁,怎么保证互斥?

单机锁解决的是进程内的问题,分布式锁解决的是跨机器的问题。

模块速览

分布式锁是分布式系统中最重要的基础设施之一。

章节篇数核心内容
分布式锁基础1 篇五大要求:互斥、可重入、不死锁、公平性、高性能
Redis 分布式锁8 篇SETNX、Redisson、看门狗、公平锁、读写锁、联锁
其他实现方案3 篇MySQL 唯一索引、ZooKeeper 临时顺序节点、对比选型

五大要求

分布式锁必须满足以下五个条件:

1. 互斥性:在任意时刻,只有一个客户端持有锁
2. 不会死锁:即使客户端崩溃,锁也能被释放(TTL / Lease)
3. 可重入:同一个客户端可以多次获取同一把锁
4. 公平性(可选):锁按请求顺序分配(FIFO)
5. 高性能:获取 / 释放锁的操作必须快

实现方案对比

方案性能可靠性实现复杂度适用场景
Redis SETNX最高高性能场景
Redisson推荐使用
ZooKeeper高可靠性场景
MySQL备选方案
etcdK8s 生态

面试高频问题

Q1:Redis 分布式锁如何实现可重入?

「Redis Hash 结构存储锁信息:key=锁名,field=持有者 ID,value=重入计数。 获取锁时,如果是自己持有则计数+1 并续期;否则尝试获取锁。 释放锁时,计数归零才真正删除锁。」

Q2:Redisson 的看门狗机制是什么?

「看门狗解决的是「锁 TTL 到了但业务还没执行完」的问题。 Redisson 默认每 10 秒自动续期一次(internalLockLeaseTime / 3)。 只要持有锁的业务还在运行,看门狗就会一直续期。 业务执行完毕后释放锁,看门狗自动停止。」

Q3:Redis 分布式锁超时了怎么办?

「锁超时的本质是:业务执行时间 > 锁 TTL。 解决方案有三个:

  1. 合理评估 TTL + 看门狗续期
  2. 任务设计为可中断的,分段执行
  3. 锁值中携带预期完成时间,检查任务是否超时再继续」

延伸阅读

分布式锁的选择建议:

  • Redis:首选方案,推荐使用 Redisson,性能最高
  • ZooKeeper:金融、配置等高可靠性场景
  • MySQL:作为备选或过渡方案

记住:没有最好的方案,只有最合适的方案。

基于 VitePress 构建