一句话先给你结论
Redis Watchdog 是 Redisson 分布式锁的"自动续命机制",用于防止业务还没执行完,锁却过期被别人抢走。
它不是 Redis 内置功能,是 Redisson 客户端实现的。
一、没有 Watchdog 会发生什么?
你用 Redis 锁时,通常这样:
SET order_lock user1 NX EX 30
含义:
user1 拿锁 30 秒
如果你的业务跑了 45 秒:
| 时间 | 发生什么 |
|---|---|
| 0s | user1 拿锁 |
| 30s | Redis 自动释放锁 |
| 31s | user2 拿到锁 |
| 45s | user1 还在执行业务 |
结果:
两个人同时改订单 ------ 数据直接炸了
二、Watchdog 是怎么解决这个问题的?
Redisson 不给锁设置固定过期时间,而是:
给锁一个"默认租期" + 后台线程自动续期
默认:
锁有效期 = 30 秒 每 10 秒自动续 30 秒
三、Watchdog 的工作机制
当你调用:
RLock lock = redisson.getLock("order_lock");
lock.lock(); // 没有指定过期时间
Redisson 在内部做了三件事:
1️⃣ 获取锁
SET order_lock uuid NX PX 30000
成功后,启动一个后台线程(Watchdog)
2️⃣ Watchdog 定时续期
每隔 10 秒执行 Lua 脚本:
if redis.call("get", "order_lock") == uuid then redis.call("pexpire", "order_lock", 30000) end
含义:
只要还是我持有锁,就帮我续命 30 秒
3️⃣ 业务完成,释放锁
lock.unlock();
Redisson:
-
删除 Redis key
-
停止 Watchdog 线程
四、为什么 Watchdog 不会"误续别人锁"?
因为:
锁里存的是 UUID
只有:
value == 当前客户端 uuid
才会续期。
别人抢到锁后:
-
value 已变
-
Watchdog 续期失败
五、Watchdog 解决的本质问题
它解决的是:
"分布式锁的持有时间 ≠ 业务执行时间"
它让锁变成:
跟着业务跑,而不是跟着 TTL 跑
六、你在面试中可以这样说
Redis 的 Watchdog 是 Redisson 实现的一种自动续期机制,通过后台定时任务 + Lua 脚本,只要客户端还持有锁,就不断延长锁的 TTL,防止长事务执行时锁提前过期导致并发安全问题。
这是架构师级标准答案。
七、一个高级追问你也能接住
问:Watchdog 会不会导致死锁?
答:
不会。
如果进程挂了,Watchdog 线程也会消失,锁不会再续期,TTL 到期后自动释放。