详细说说Redis分布式锁和ZK分布式锁
在分布式系统中,分布式锁是实现资源互斥访问的核心机制。Redis 和 ZooKeeper(ZK)是两种常用的分布式锁实现方案,但它们的实现原理、优缺点和适用场景存在显著差异。
一、Redis 分布式锁
实现原理
-
基础命令:
SET key value NX PX timeout
(推荐方式):NX
:仅当键不存在时设置键值(保证互斥)。PX
:设置键的过期时间(避免死锁)。
- 示例:
SET lock:order123 "client1" NX PX 30000
(客户端 client1 获取锁,锁自动释放时间为 30 秒)
-
释放锁:
- 必须通过 Lua 脚本原子性验证值后删除,防止误删其他客户端的锁:
if redis.call("GET", KEYS[1]) == ARGV[1] thenreturn redis.call("DEL", KEYS[1]) elsereturn 0 end
- 必须通过 Lua 脚本原子性验证值后删除,防止误删其他客户端的锁:
-
高级方案:
- RedLock 算法(多节点 Redis 集群):
- 客户端依次向多个 Redis 节点申请锁,超过半数成功则视为获取锁。
- 争议点:时钟漂移、网络分区等问题可能影响正确性(社区存在争论)。
- RedLock 算法(多节点 Redis 集群):
核心特性
- AP 系统:Redis 优先保证可用性(Availability)和分区容忍性(Partition Tolerance),弱一致性。
- 性能高:基于内存操作,适合高并发场景。
- 锁自动释放:依赖过期时间,需合理设置避免业务未完成锁失效。
优点
- 简单易用:API 直观,适合快速实现。
- 高吞吐量:单节点 Redis 可支撑数万 TPS。
- 容错性:通过 RedLock 降低单点故障风险(但有争议)。
缺点
- 非强一致:主从异步复制可能导致锁丢失(故障转移时)。
- 时钟依赖:过期时间依赖系统时钟,时钟漂移可能引发问题。
- 误删风险:需严格通过 Lua 脚本保证原子性释放。
二、ZooKeeper 分布式锁
实现原理
-
临时顺序节点:
- 客户端在 ZK 的锁目录下创建临时顺序节点(如
/locks/lock_00000001
)。 - 临时性:客户端会话结束(如宕机)时节点自动删除,避免死锁。
- 顺序性:节点按创建顺序编号,便于实现公平锁。
- 客户端在 ZK 的锁目录下创建临时顺序节点(如
-
锁获取:
- 客户端检查自己是否是当前最小序号节点:
- 如果是,获得锁。
- 否则,监听前一个节点的删除事件(避免“羊群效应”)。
- 客户端检查自己是否是当前最小序号节点:
-
锁释放:
- 业务完成后主动删除节点,或会话超时后自动删除。
核心特性
- CP 系统:ZooKeeper 优先保证一致性(Consistency)和分区容忍性(Partition Tolerance)。
- 强一致性:通过 ZAB 协议保证数据一致性。
- 公平锁:天然支持按顺序获取锁。
优点
- 可靠性高:无锁超时问题,客户端宕机自动释放锁。
- 无时钟依赖:锁的释放仅依赖会话状态。
- 可监控:通过 Watcher 机制实现锁状态实时感知。
缺点
- 性能较低:ZK 的写操作(如创建节点)需集群多数节点确认,吞吐量低于 Redis。
- 实现复杂:需处理 Watcher 的触发和重连逻辑。
- 网络敏感:频繁的 Watcher 通知可能引发性能问题。
三、关键对比
特性 | Redis 分布式锁 | ZooKeeper 分布式锁 |
---|---|---|
一致性模型 | AP(最终一致) | CP(强一致) |
性能 | 高吞吐量(内存操作) | 较低(需集群协调) |
锁释放方式 | 依赖过期时间(需合理设置) | 会话结束自动释放(无超时风险) |
可靠性 | 依赖 Redis 持久化和集群机制 | 高(强一致性保证) |
实现复杂度 | 简单(基于 SETNX + Lua) | 复杂(需处理节点监听和回调) |
适用场景 | 高并发、允许短暂不一致 | 强一致性、高可靠性要求 |
典型问题 | 锁提前释放、脑裂问题 | 羊群效应、会话管理 |
四、场景选择建议
-
选择 Redis:
- 高并发场景(如秒杀、库存扣减)。
- 允许短暂锁失效(业务能处理重试或幂等)。
- 对性能要求极高,可接受最终一致性。
-
选择 ZooKeeper:
- 需要强一致性(如金融交易、关键配置更新)。
- 锁持有时间较长或不可预测(避免超时风险)。
- 需要公平锁或可重入锁。
五、注意事项
- Redis 锁的陷阱:
- 避免锁过期时间过短导致业务未完成锁被释放。
- 推荐使用 Redisson 客户端(内置看门狗自动续期)。
- ZK 锁的优化:
- 使用临时顺序节点避免羊群效应。
- 合理设置会话超时时间(
sessionTimeout
)。
🐮👵
- Redis 分布式锁:轻量级、高性能,适合对一致性要求不高的高频场景。
- ZooKeeper 分布式锁:强一致、高可靠,适合关键业务场景,但需容忍较低性能。
你想要的我全都有:https://pan.q删掉憨子uark.cn/s/75a5a07b45a2