502 字
3 分钟
Redisson 看门狗(watch dog)机制了解吗?
1. 为什么需要看门狗?
Redis 分布式锁通常通过设置过期时间,避免客户端异常退出后锁一直不释放。
例如,线程 A 获取锁时设置了 30 秒过期时间:
SET lock value NX EX 30但是,锁的过期时间不一定等于业务的执行时间。
假设业务需要执行 50 秒:
- 第 0 秒:线程 A 获取锁,锁的有效期为 30 秒。
- 第 30 秒:锁过期,Redis 自动删除锁。
- 第 30 秒之后:线程 A 仍在执行业务,线程 B 却可以获取同一把锁。
- 结果:线程 A 和线程 B 可能同时执行业务,导致数据不一致。
核心矛盾
- 锁的过期时间设置太短:业务没执行完,锁就过期了。
- 锁的过期时间设置太长:客户端异常退出后,其他线程可能要等待很久才能获取锁。
因此,需要一种机制:业务没执行完时自动延长锁的有效期,业务结束后释放锁,客户端宕机后锁也能最终自动过期。
2. 什么是看门狗?
Redisson 看门狗机制是 Redisson 分布式锁提供的一种自动续期机制,主要是为了解决业务执行时间超过锁的过期时间,导致锁提前释放的问题。
默认情况下,锁的看门狗超时时间是 30 秒。当我们使用 lock() 获取锁且没有指定租约时间时,Redisson 会在后台定期检查锁的持有情况,并将锁的过期时间续期为 30 秒。
当业务执行完毕并调用 unlock() 后,看门狗就会停止续期并释放锁。如果客户端宕机,无法继续续期,锁最终会因为 TTL 到期而自动释放,从而避免死锁。
需要注意的是,如果获取锁时显式指定了 leaseTime,就会使用指定的租约时间,不再依赖看门狗自动续期。
Redisson 看门狗(watch dog)机制了解吗?
https://blog.xqcherry.top/posts/interview/redis/redisson-watchdog/ 目录