Redis分布式锁方案

使用 Redis 的 SET key value NX EX实现分布式锁时,主要问题是锁过期时间不好设置:如果设置过短,业务未完成锁就过期;设置过长,会降低系统并发度。为此可以使用 Redisson 封装的分布式锁,它内部通过「看门狗机制」自动续期锁(默认锁 30 秒,每 10 秒续期一次),同时通过 Lua 脚本保证加解锁的原子性,从而确保分布式环境下的并发安全。

Redisson分布式锁自动续约机制(看门狗)

线程1尝试tryLock锁未指定锁的过期时间 获取成功后会自动启动看门狗机制

初始加锁

​ 当调用 lock() 时,Redisson 会通过 Lua 脚本向 Redis 发送加锁命令,设置锁的初始过期时间为 LockWatchdogTimeout(默认 30 秒)。

​ 锁的数据结构为 Hash,键为锁名称,field 为线程 ID,value 为重入次数。

启动定时任务

​ 加锁成功后,Redisson 会启动一个后台定时任务(通过 Netty 的 HashedWheelTimer 实现),每隔 10 秒执行一次。

续期逻辑:

​ 定时任务通过lua脚本检查锁是否存在并且被当前线程持有

​ 若条件满足,则通过 pexpire 命令将锁的过期时间重置为 LockWatchdogTimeout(30 秒)。

​ 续期成功后,继续等待下一个检查周期。

锁释放时终止续期

​ 当调用 unlock() 释放锁时,会同时取消续期的定时任务,避免无限续期。