Redisson看门狗自动续期触发条件是加锁时未指定leaseTime(即leaseTime=-1),默认每10秒通过Lua脚本原子校验线程持有状态并重置TTL为30秒,依赖客户端存活,宕机后锁自然过期。

Redisson 实现分布式锁的自动续期,核心在于它的 Watchdog(看门狗)机制——只要加锁时没指定固定过期时间(即 leaseTime = -1),它就会在后台自动启动一个定时任务,周期性地给锁续期,避免业务执行慢导致锁提前释放。
自动续期是怎么触发的?
关键看加锁方式:
- 调用
lock()或无参tryLock():默认启用 Watchdog,初始租约 30 秒,自动续期 - 调用
tryLock(waitTime, leaseTime, unit)且leaseTime > 0:锁到期即释放,不启动看门狗,不会自动续期 - 调用
tryLock(waitTime, -1, unit):等价于无参方式,启用自动续期
续期是怎么工作的?
Watchdog 默认每 10 秒检查一次锁状态(基于 lockWatchdogTimeout=30000ms 的 1/3 计算):
- 检查当前线程是否仍持有该锁(通过 Lua 脚本原子判断 key 存在且 hash 中包含本线程 ID)
- 如果持有,就把 Redis 中这个锁 key 的过期时间重置为 30 秒
- 只要业务没执行完、没调用
unlock(),这个续期动作就会持续进行 - 一旦客户端进程宕机或连接断开,续期任务停止,锁会在 30 秒后自然过期
使用示例(Java)
正确启用自动续期的写法:
RLock lock = redissonClient.getLock("order:pay:" + orderId);
try {
// 不传 leaseTime → 启动看门狗,默认 30 秒续期
if (lock.tryLock(5, 10, TimeUnit.SECONDS)) {
try {
// 执行扣库存、生成订单等耗时操作
processOrder();
} finally {
lock.unlock(); // 主动释放,Watchdog 停止
}
} else {
throw new BusinessException("获取锁失败,请重试");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
需要注意的细节
自动续期不是“万能保险”,有几点必须清楚:
- 续期依赖客户端存活:JVM 崩溃、机器断电、网络彻底中断 → 续期线程消失 → 锁最终过期
- 锁是可重入的:同一线程多次
lock(),Watchdog 只启动一次,但解锁需对应次数 - 不要手动用
expire或setex改锁的 TTL:会破坏 Redisson 内部状态,可能导致续期失效或误删锁 - 若业务明确知道最大执行时间(如 ≤ 5 秒),可设固定
leaseTime关闭 Watchdog,更轻量


















