大家好,我是程序员二叉。
简介
分布式锁是分布式系统中保证并发安全的核心技术,Redis 分布式锁凭借高性能、易实现成为主流方案。本文详细讲解基础 SET NX EX 实现、锁超时释放与自动续约、Redisson 看门狗机制、主从架构锁失效问题、可重入锁原理,覆盖面试高频考点与生产落地方案。欢迎点赞收藏关注。
一、Redis 分布式锁基础实现原理(SET NX EX)
1. 核心命令
SET lock_key 唯一标识 NX EX 30- NX:仅
key不存在时才加锁成功,保证互斥性 - EX:设置过期时间,避免服务宕机导致死锁
- 唯一标识:防止锁被其他线程误删
2. 执行流程
多个线程同时执行加锁命令,只有一个线程成功
加锁成功执行业务逻辑
释放锁必须通过Lua 脚本判断唯一标识,再删除 key,保证原子性
3. 核心作用
实现多节点之间的互斥访问,防止并发问题。
二、分布式锁超时释放问题
1. 问题描述
锁设置了固定过期时间,例如 30 秒,但业务执行时间超过 30 秒,锁自动过期被释放,其他线程可以抢占锁,导致并发安全问题。
2. 根本原因
锁过期时间 < 业务执行时间。
3. 解决方案
锁自动续约(续命):在锁即将过期时,如果业务未执行完,自动延长锁时间。
三、锁续约实现 & Redisson 看门狗原理
1. 手动续约缺点
代码侵入性强、定时任务难维护、可靠性低。
2. Redisson 看门狗(WatchDog)自动续约原理
- 加锁默认超时时间30s
- 启动后台定时线程(看门狗)
- 每 10s检查一次:若线程仍持有锁,将锁超时时间重置为 30s
- 业务执行完毕释放锁,看门狗停止
- 服务宕机,看门狗消失,锁自动过期,无死锁风险
3. 优点
自动化、无侵入、高可靠,是生产环境标准方案。
四、主从架构下分布式锁失效问题
1. 失效场景
- 主线程加锁成功
- 主节点未同步锁到从节点就宕机
3.哨兵选举新主节点
4.其他线程在新主节点加锁成功
→ 出现两把锁,并发安全失效
2. 根本原因
主从异步复制,存在数据同步延迟间隙。
3. 解决方案
- RedLock 红锁:复杂、性能差、官方不推荐
- 业务兼容最终一致性:通用折中方案
- Zookeeper 分布式锁:强一致性,无主从失效问题
五、Redisson 可重入锁原理
1. 可重入锁定义
同一个线程可多次获取同一把锁,不会自己锁死自己。
2. 实现原理
- 数据结构:Redis Hash
- key:锁名
- field:线程唯一标识
- value:重入次数
- 加锁:
- 首次加锁:
hset+ 启动看门狗 - 同一线程再次加锁:计数 +1
- 首次加锁:
- 解锁:
- 计数 -1
- 计数为 0:删除
key,关闭看门狗
3. 保证原子性
全部操作通过Lua 脚本执行,确保原子性。
六、总结
- 基础分布式锁:
SET NX EX+唯一值+Lua 解锁,实现互斥与防误删。 - 锁超时问题:业务执行时间过长导致锁提前释放,必须使用自动续约。
- 看门狗:定时自动延长锁有效期,解决锁超时释放问题。
- 主从锁失效:主从异步复制导致锁丢失,无法完美规避,可通过业务或组件兼容。
- 可重入锁:Hash 结构 + 重入计数 + Lua 脚本实现同一线程重复加锁。