Redisson Watch Dog 机制通过后台线程每10秒自动续期锁TTL(默认30秒)解决过期误释放问题,需同一客户端实例维持连接;RLock支持可重入与自动续期,推荐用tryLock(..., 0, ...)启用看门狗,并在finally中调用unlock()确保释放。

Redisson 的 Watch Dog 机制是解决分布式锁“过期误释放”问题的核心设计,它让锁在业务执行时间不确定时仍能安全持有,避免因超时导致的并发冲突。
Watch Dog 自动续期原理
当客户端成功加锁后,Redisson 默认启动一个后台看门狗线程(每 10 秒触发一次),自动检测该锁是否仍在被当前客户端持有。若锁存在且未被主动释放,就重置其 TTL(Time To Live)为默认 30 秒(可通过 lockWatchdogTimeout 配置)。这个过程无需业务代码干预,完全异步、透明运行。
关键前提是:锁必须由同一个 Redisson 客户端实例加锁并维持连接;一旦客户端断连或进程退出,看门狗失效,锁会在 TTL 到期后自动删除,满足防死锁要求。
正确使用可重入锁 RLock
直接调用 RLock lock = redissonClient.getLock("order:123"); 获取锁对象,它天然支持可重入、自动续期和公平性控制。加锁时建议指定等待时间和持有时间:
立即学习“Java免费学习笔记(深入)”;
- tryLock(long waitTime, long leaseTime, TimeUnit unit):阻塞等待获取锁,leaseTime 设为 0 表示启用 Watch Dog(即不设固定过期时间,交由看门狗管理)
- lock(long leaseTime, TimeUnit unit):非阻塞加锁,leaseTime > 0 时禁用看门狗;设为 0 才启用自动续期
- 不推荐只用 lock()(无参),它会采用默认 leaseTime=30s,但若业务耗时超过 30 秒又没开启看门狗,就会提前释放锁
确保锁释放安全可靠
必须使用同一把锁对象调用 unlock(),Redisson 内部通过 UUID + 线程 ID 校验锁归属,防止误删他人锁。典型用法是配合 try-finally:
- 加锁成功后立即进入 try 块执行业务逻辑
- finally 中调用 lock.unlock() —— 即使业务异常或超时,也能保证释放动作被执行
- 切忌在异步线程中 unlock,因为看门狗绑定的是加锁线程上下文,跨线程调用可能失败
配置与容错要点
Watch Dog 生效依赖于 Redisson 正常心跳和命令执行能力。需注意:
- 集群/哨兵模式下,确保 Config 正确配置了所有节点地址,并启用 setScanInterval(如 5000ms)以及时感知拓扑变化
- 生产环境建议显式设置 config.setLockWatchdogTimeout(60_000)(单位毫秒),匹配最长预期业务耗时,避免频繁续期或过早过期
- 若业务确实超长(如批量导入),应拆分任务粒度,或改用带业务状态校验的乐观锁方案,而非单纯延长 leaseTime


















