redis本身不支持自动续期,该功能由客户端框架(如redisson)通过watchdog看门狗线程实现:每10秒校验锁归属并原子性重置ttl为30秒,直至线程释放锁或终止。

Redis 本身不提供自动续期能力,自动续期是客户端框架(如 Redisson)在应用层实现的机制,核心思路是:加锁时不依赖固定过期时间,而是由持锁方主动、周期性地延长锁的存活时间。
Watchdog 看门狗线程
Redisson 默认启用 Watchdog 机制。当调用 lock() 成功后,它会立即启动一个后台守护线程:
- 默认每 10 秒检查一次当前锁是否仍被本线程持有(通过比对锁内存储的唯一 client ID)
- 若确认持有,就执行 Lua 脚本重置 TTL 为初始值(默认 30 秒)
- 只要业务线程未退出、未调用
unlock(),续期就会持续进行 - 线程终止或显式释放锁时,Watchdog 自动停止,不再续期
续期的安全前提:原子校验
每次续期不是简单地延长过期时间,而是先验证“当前锁确实还属于我”。Redisson 使用如下 Lua 脚本确保操作原子性:
- 读取锁 key 对应的 hash 结构中,是否存有本客户端的唯一标识(如
8743c9c0...:1) - 仅当匹配成功,才执行
PEXPIRE更新 TTL - 避免因网络延迟、主从切换等原因导致误续他人持有的锁
参数配置与实践建议
续期效果高度依赖合理配置:
- 初始 leaseTime:设为业务平均耗时的 2–3 倍,减少频繁续期压力
-
续期间隔:默认为
lockWatchdogTimeout / 3(即 30s → 10s),不宜过短(增加 Redis 压力)或过长(增大锁失效风险) - 最大续期保障:虽无显式次数限制,但 Watchdog 会在客户端断连后自然失效,30 秒后锁自动释放,防止永久占用
不依赖 Watchdog 的手动续期方案
若使用原生 Redis 客户端(如 Jedis),可自行实现类似逻辑:
- 加锁时记录 client ID,并启动独立线程/定时器
- 定期执行校验 + 续期 Lua 脚本:
if redis.call("GET", KEYS[1]) == ARGV[1] then return redis.call("PEXPIRE", KEYS[1], ARGV[2]) else return 0 end - 需额外处理线程生命周期、异常中断、JVM 停止钩子等边界情况











