redisson看门狗机制默认启用,通过netty hashedwheeltimer每10秒异步执行lua脚本原子校验并续期锁至30秒;仅当未指定leasetime时触发,unlock或客户端关闭即自动终止。

Redisson 的看门狗(Watch Dog)不是靠“轮询线程池”或“额外守护线程”,而是用 Netty 的 HashedWheelTimer 实现轻量、精准的异步续期。只要加锁时没指定固定租约时间(即 leaseTime = -1),它就自动启动,全程无需手动干预。
看门狗触发条件
只有满足以下任一情况,Watch Dog 才会激活:
- 调用
lock()无参方法(默认启用看门狗) - 调用
tryLock(waitTime, unit),未传leaseTime - 显式传入
leaseTime = -1,例如lock(-1, TimeUnit.SECONDS)
⚠️ 一旦你指定了具体过期时间(如 lock(10, TimeUnit.SECONDS)),看门狗就不会启动,后续也不会续期。
续期是怎么执行的
续期不是简单发个 EXPIRE 命令,而是通过一段 Lua 脚本在 Redis 端原子完成校验 + 设置:
- 先检查锁的 Hash 结构中是否存在当前客户端的
UUID:ThreadId - 存在 → 执行
PEXPIRE key 30000,把 TTL 重置为 30 秒(默认值) - 不存在(锁已被释放或被其他客户端覆盖)→ 续期失败,自动终止任务
整个过程由 Lua 保证原子性,避免了“查到有锁 → 网络延迟 → 锁已失效 → 还强行续期”的竞态问题。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
续期的时间节奏
续期不是实时的,而是一套稳定节拍:
- 首次续期检查:加锁成功后 10 秒(即
lockWatchdogTimeout / 3 = 30000 / 3) - 之后每 10 秒触发一次检查和可能的续期
- 每次续期都将锁的 TTL 重置为 30 秒(可配置
lockWatchdogTimeout)
这个节奏兼顾了可靠性与 Redis 压力:太频繁会增加开销,太稀疏则可能错过业务长尾场景。
什么时候停止续期
看门狗非常“守规矩”,只在锁真正被持有期间工作:
- 业务代码调用
unlock()→ 立即从全局EXPIRATION_RENEWAL_MAP中移除对应锁项,并取消定时任务 - 当前线程异常中断或客户端实例关闭 → 自动清理续期状态
- 锁被其他客户端强制删除或超时释放 → 下次续期脚本检测失败,递归终止
没有残留任务,也没有“僵尸续期”。










