admin管理员组

文章数量:1037775

分布式锁

一、核心原理

分布式锁的本质是通过外部共享存储系统协调多个进程/线程对共享资源的互斥访问,需满足以下特性:

  • 互斥性:同一时刻仅一个客户端持有锁。
  • 可重入性:同一客户端可多次获取同一把锁(防止自身死锁)。
  • 超时机制:自动释放锁避免死锁(如 Redis 的 TTL、ZooKeeper 的临时节点)。
  • 容错性:在节点故障时仍能正常释放或续期锁。
二、主流实现方案对比

<!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}

方案

实现原理

优点

缺点

基于数据库

利用唯一约束或行锁(SELECT FOR UPDATE)实现互斥。

实现简单,无需额外组件

性能差(高并发下瓶颈明显),死锁风险高

基于 Redis

使用 SETNX 或 SET key value EX NX 原子命令加锁,结合 Lua 脚本保证原子性。

性能高(毫秒级响应),支持自动续期

集群模式下存在脑裂风险,需 Redisson 等框架增强

基于 ZooKeeper

通过临时顺序节点实现排队,监听前序节点删除事件触发锁获取。

强一致性,天然支持可重入与公平锁

性能低于 Redis(频繁节点操作与监听)

方案细节

  1. Redis 高级实现(Redisson):
    1. 可重入:通过 Hash 结构记录线程标识与重入次数。
    2. 锁续期:看门狗机制自动延长锁超时时间(默认每 10 秒续期 30 秒)。
    3. 重试机制:支持阻塞等待与超时重试(tryLock 方法)。
  2. ZooKeeper 实现
    1. 临时顺序节点:每个请求生成顺序编号,最小编号节点获得锁。
    2. 事件监听:前序节点释放时触发回调通知后续节点,实现公平锁。
三、关键问题与解决方案
  1. 死锁风险
    1. 超时释放:设置合理的 TTL(Redis)或临时节点(ZooKeeper)。
    2. 心跳检测:客户端定期续期(如 Redisson 的看门狗)。
  2. 锁误释放
    1. 唯一标识校验:释放锁时验证持有者身份(如 Redis 的 value 存储客户端 ID)。
  3. 集群容灾
    1. Redis 集群:需 Redlock 算法(多节点投票)降低脑裂风险。
    2. ZooKeeper 集群:依赖 ZAB 协议保证强一致性。
  4. 性能优化
    1. 减少网络开销:使用 Lua 脚本合并原子操作(如加锁与设置超时)。
    2. 异步化:非核心路径采用异步锁(如 Redis 的 tryLockAsync)。
四、应用场景与选型建议
  1. 典型场景
    1. 高并发秒杀:Redis 分布式锁(高性能,自动续期)。
    2. 分布式事务协调:ZooKeeper(强一致性,适用于金融系统)。
    3. 简单低频任务:数据库锁(无需引入新组件,适合小型系统)。
  2. 选型维度
    1. 性能需求:Redis > ZooKeeper > 数据库。
    2. 一致性要求:ZooKeeper > Redis(需 Redlock) > 数据库。
    3. 开发复杂度:数据库 < Redis(框架封装) < ZooKeeper(需处理节点监听)。
五、总结

分布式锁设计需权衡性能、一致性与复杂度。推荐优先使用 Redis(配合 Redisson) 满足大多数高并发场景,强一致性需求选择 ZooKeeper,简单场景可考虑数据库方案。无论何种方案,需结合业务特点设计锁粒度、超时时间及容灾策略,必要时通过熔断降级保障系统可用性。

分布式锁

一、核心原理

分布式锁的本质是通过外部共享存储系统协调多个进程/线程对共享资源的互斥访问,需满足以下特性:

  • 互斥性:同一时刻仅一个客户端持有锁。
  • 可重入性:同一客户端可多次获取同一把锁(防止自身死锁)。
  • 超时机制:自动释放锁避免死锁(如 Redis 的 TTL、ZooKeeper 的临时节点)。
  • 容错性:在节点故障时仍能正常释放或续期锁。
二、主流实现方案对比

<!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}

方案

实现原理

优点

缺点

基于数据库

利用唯一约束或行锁(SELECT FOR UPDATE)实现互斥。

实现简单,无需额外组件

性能差(高并发下瓶颈明显),死锁风险高

基于 Redis

使用 SETNX 或 SET key value EX NX 原子命令加锁,结合 Lua 脚本保证原子性。

性能高(毫秒级响应),支持自动续期

集群模式下存在脑裂风险,需 Redisson 等框架增强

基于 ZooKeeper

通过临时顺序节点实现排队,监听前序节点删除事件触发锁获取。

强一致性,天然支持可重入与公平锁

性能低于 Redis(频繁节点操作与监听)

方案细节

  1. Redis 高级实现(Redisson):
    1. 可重入:通过 Hash 结构记录线程标识与重入次数。
    2. 锁续期:看门狗机制自动延长锁超时时间(默认每 10 秒续期 30 秒)。
    3. 重试机制:支持阻塞等待与超时重试(tryLock 方法)。
  2. ZooKeeper 实现
    1. 临时顺序节点:每个请求生成顺序编号,最小编号节点获得锁。
    2. 事件监听:前序节点释放时触发回调通知后续节点,实现公平锁。
三、关键问题与解决方案
  1. 死锁风险
    1. 超时释放:设置合理的 TTL(Redis)或临时节点(ZooKeeper)。
    2. 心跳检测:客户端定期续期(如 Redisson 的看门狗)。
  2. 锁误释放
    1. 唯一标识校验:释放锁时验证持有者身份(如 Redis 的 value 存储客户端 ID)。
  3. 集群容灾
    1. Redis 集群:需 Redlock 算法(多节点投票)降低脑裂风险。
    2. ZooKeeper 集群:依赖 ZAB 协议保证强一致性。
  4. 性能优化
    1. 减少网络开销:使用 Lua 脚本合并原子操作(如加锁与设置超时)。
    2. 异步化:非核心路径采用异步锁(如 Redis 的 tryLockAsync)。
四、应用场景与选型建议
  1. 典型场景
    1. 高并发秒杀:Redis 分布式锁(高性能,自动续期)。
    2. 分布式事务协调:ZooKeeper(强一致性,适用于金融系统)。
    3. 简单低频任务:数据库锁(无需引入新组件,适合小型系统)。
  2. 选型维度
    1. 性能需求:Redis > ZooKeeper > 数据库。
    2. 一致性要求:ZooKeeper > Redis(需 Redlock) > 数据库。
    3. 开发复杂度:数据库 < Redis(框架封装) < ZooKeeper(需处理节点监听)。
五、总结

分布式锁设计需权衡性能、一致性与复杂度。推荐优先使用 Redis(配合 Redisson) 满足大多数高并发场景,强一致性需求选择 ZooKeeper,简单场景可考虑数据库方案。无论何种方案,需结合业务特点设计锁粒度、超时时间及容灾策略,必要时通过熔断降级保障系统可用性。

本文标签: 分布式锁