🔐 黑马程序猿 - 实战篇 - 09. 分布式锁:基本原理和不同实现方式
在分布式系统中,如何保证同一资源在多节点并发访问时的数据一致性和线程安全?这正是分布式锁要解决的问题。
本节内容将带你深入理解分布式锁的定义、实现条件及三种主流实现方式(MySQL、Redis、Zookeeper)的特点与对比,帮助你掌握企业开发中高并发控制的核心利器。
🔧 4.1 什么是分布式锁?
分布式锁(Distributed Lock),指的是在分布式系统或集群模式下,用于控制多个进程或线程对共享资源访问的锁机制。其核心目标是:让所有线程都“使用同一把锁”,从而实现串行化执行,避免并发冲突。
在单体项目中,我们可以通过 synchronized
或 ReentrantLock
等方式实现线程互斥。但在多JVM或多服务器节点的系统中,这些锁机制就无法跨进程或跨机器生效,这时候就必须依赖一个“全局可见”的第三方中间件来持有锁的状态。
例如,使用 Redis 中的 setnx
命令,我们就可以将锁状态交由 Redis 统一协调管理,使得分布在不同节点上的线程都能竞争同一把锁。
👇 下面这张图清晰地展示了 Redis 实现分布式锁时多线程串行执行的过程:
📌 分布式锁必须满足哪些条件?
在实际项目中,一个“合格”的分布式锁,至少应具备以下 5 个核心特性:
特性 | 说明 |
---|---|
✅ 可见性 | 多进程之间必须能观察到锁的变化。例如,线程 A 加锁后,线程 B 不能再加锁,必须等待释放。 |
✅ 互斥性 | 同一时间,只能有一个线程持有锁。 |
✅ 高可用 | 锁服务(如Redis、Zookeeper)必须保持高可用,否则分布式系统的关键路径将被阻塞。 |
✅ 高性能 | 加锁、解锁过程不能成为性能瓶颈,尤其是在高并发场景下。 |
✅ 安全性 | 避免“锁失效”、死锁、误删他人锁等问题。确保锁的完整生命周期安全。 |
🎯 总结如下图:
🚀 4.2 三种主流实现方式对比
目前业界常见的三种分布式锁实现方案分别是:
-
MySQL
-
Redis
-
Zookeeper
我们分别来看看它们的原理与优缺点。
① MySQL 实现分布式锁
✅ 利用数据库的唯一索引约束或
SELECT ... FOR UPDATE
实现加锁。
-
通过插入一条唯一 key(如订单号)数据,如果插入成功,则代表加锁成功,插入失败则说明锁已被其他线程占用。
-
查询时也可用悲观锁
select ... for update
锁定特定行。
🧱 优点:
-
易于理解和使用
-
不需要额外中间件
⚠️ 缺点:
-
加锁过程依赖磁盘I/O,性能较低
-
高并发下容易出现死锁
-
数据库连接资源消耗大
② Redis 实现分布式锁
✅ 使用
SETNX
(set if not exists)命令加锁,结合EXPIRE
实现锁超时机制。
SET lock_key uuid_value NX EX 30
-
NX
:仅当 key 不存在时设置成功 -
EX
:设置锁的过期时间,防止死锁 -
解锁需校验 value 保证只释放自己加的锁
🧱 优点:
-
性能极高(内存级别)
-
使用简单,社区支持丰富
-
支持可重入、续期、自动失效等功能(可结合Redisson)
⚠️ 缺点:
-
Redis宕机可能导致锁失效(可使用持久化方案或RedLock)
③ Zookeeper 实现分布式锁
✅ 通过 临时顺序节点 机制实现加锁,基于 Zookeeper 的有序性和 Watcher 特性。
-
每个线程创建临时顺序节点,编号最小者获得锁
-
其他线程监听前一个节点的删除事件
🧱 优点:
-
强一致性
-
节点断开自动释放锁,安全性高
⚠️ 缺点:
-
实现复杂,学习成本高
-
高并发性能逊色于Redis
📊 实现方式对比汇总表
实现方式 | 互斥性 | 高可用 | 高性能 | 安全性 |
---|---|---|---|---|
MySQL | ✅ | 一般 | 较低 | 断开连接自动释放锁 |
Redis | ✅ | ✅ | ✅ | 需校验锁拥有者 |
Zookeeper | ✅ | ✅ | 一般 | 临时节点断开即释放 |
👇 对比图如下:
🧠 小结与思考
-
分布式锁是分布式系统中保证资源互斥访问的基础设施。
-
Redis 和 Zookeeper 是企业中最常用的实现方式。
-
在性能敏感场景中,推荐使用 Redis 实现分布式锁,配合
setnx + expire
、Lua脚本或 Redisson 提供安全保障。 -
若对强一致性要求极高,Zookeeper 是更稳妥的选择。
-
不建议使用 MySQL 实现分布式锁,性能和扩展性难以胜任复杂业务需求。
📘 后续预告
在下一节内容中,我们将深入实践 Redis 分布式锁的具体实现代码,并分析其加锁原理、超时控制、自动续期、解锁逻辑等关键细节,敬请期待!