Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions 05-system-design/distributed/9.分布式锁.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,30 @@

## 6.开发分布式锁

## 面试补充:Redis 与 ZooKeeper 分布式锁

分布式锁题不能只回答“加锁解锁”,还要说明锁的互斥性、过期时间、续期、误删、故障恢复和业务幂等。

### Redis 锁的基础写法

Redis 锁通常使用 `SET key value NX PX timeout`,`NX` 保证只有不存在时才能加锁,`PX` 防止客户端宕机后锁永久不释放。`value` 必须是唯一随机值,释放锁时通过 Lua 脚本先比对 value 再删除,避免误删其他客户端后来获得的锁。

### Redisson 的工程价值

手写 Redis 锁容易遗漏可重入、续期、等待通知和异常释放。Redisson 提供可重入锁、watchdog 自动续期、Lua 原子解锁和 Pub/Sub 唤醒等待线程,更适合 Java 生产工程。使用时仍要控制锁粒度和锁内耗时,避免热点资源被长时间串行化。

### ZooKeeper 锁的实现

ZooKeeper 分布式锁通常基于临时顺序节点。客户端创建临时顺序节点,编号最小者获得锁;不是最小者只监听前一个节点,前驱删除后再竞争。临时节点能在客户端会话失效后自动清理,顺序节点天然支持公平排队。

### 两类锁怎么选

Redis 锁性能高、实现轻,适合高频短临界区;ZooKeeper 锁一致性语义更强,适合对顺序和锁释放更敏感的场景,但吞吐和运维复杂度更高。高并发热点场景不要只依赖更重的锁,更应该拆分资源、削峰、排队或用幂等设计降低锁需求。

### 分布式锁不是最终防线

锁可能因为超时、网络分区、主从切换或业务执行过慢出现异常窗口。关键业务仍要使用唯一索引、版本号、状态机、幂等表或补偿任务兜底,确保即使锁失效也不会造成不可修复的数据错误。

---

<!-- note-nav:start -->
Expand Down