黑马程序猿 - 实战篇 - 09. 分布式锁:基本原理和不同实现方式


🔐 黑马程序猿 - 实战篇 - 09. 分布式锁:基本原理和不同实现方式

在分布式系统中,如何保证同一资源在多节点并发访问时的数据一致性和线程安全?这正是分布式锁要解决的问题。

本节内容将带你深入理解分布式锁的定义、实现条件及三种主流实现方式(MySQL、Redis、Zookeeper)的特点与对比,帮助你掌握企业开发中高并发控制的核心利器。


🔧 4.1 什么是分布式锁?

分布式锁(Distributed Lock),指的是在分布式系统或集群模式下,用于控制多个进程或线程对共享资源访问的锁机制。其核心目标是:让所有线程都“使用同一把锁”,从而实现串行化执行,避免并发冲突。

在单体项目中,我们可以通过 synchronizedReentrantLock 等方式实现线程互斥。但在多JVM或多服务器节点的系统中,这些锁机制就无法跨进程或跨机器生效,这时候就必须依赖一个“全局可见”的第三方中间件来持有锁的状态。

例如,使用 Redis 中的 setnx 命令,我们就可以将锁状态交由 Redis 统一协调管理,使得分布在不同节点上的线程都能竞争同一把锁。

👇 下面这张图清晰地展示了 Redis 实现分布式锁时多线程串行执行的过程:


📌 分布式锁必须满足哪些条件?

在实际项目中,一个“合格”的分布式锁,至少应具备以下 5 个核心特性:

特性说明
✅ 可见性多进程之间必须能观察到锁的变化。例如,线程 A 加锁后,线程 B 不能再加锁,必须等待释放。
✅ 互斥性同一时间,只能有一个线程持有锁。
✅ 高可用锁服务(如Redis、Zookeeper)必须保持高可用,否则分布式系统的关键路径将被阻塞。
✅ 高性能加锁、解锁过程不能成为性能瓶颈,尤其是在高并发场景下。
✅ 安全性避免“锁失效”、死锁、误删他人锁等问题。确保锁的完整生命周期安全。

🎯 总结如下图:


🚀 4.2 三种主流实现方式对比

目前业界常见的三种分布式锁实现方案分别是:

  1. MySQL

  2. Redis

  3. 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 分布式锁的具体实现代码,并分析其加锁原理、超时控制、自动续期、解锁逻辑等关键细节,敬请期待!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值