Redis 分布式锁一般是有自动续期机制的,不需要开发者手动续期。
典型代表就是 Redisson 的 WatchDog(看门狗)机制。
我分两种情况说清楚。
一、自己用 SETNX + EXPIRE 实现的锁
例如:
SET lock_key uuid NX PX 30000
这里设置了 30 秒过期时间。
特点:
- 30 秒后 锁自动释放
- 如果业务执行 超过 30 秒
- 锁就会 提前过期
这时如果你想避免锁过期,就需要:
开发者自己写续期逻辑。
例如:
- 定时任务
- Lua脚本延长TTL
这种实现:
没有自动续期机制。
二、使用 Redisson 分布式锁
例如:
RLock lock = redissonClient.getLock("order_lock"); lock.lock();
如果你 没有指定 leaseTime:
lock.lock();
Redisson 会启动 WatchDog 自动续期机制。
默认逻辑:
- 默认锁时间:30秒
- 每 10秒 检查一次
- 如果线程还持有锁 → 自动续期 30 秒
流程大概是:
加锁 ↓ 设置TTL = 30s ↓ watchdog线程每10s检查 ↓ 如果锁还在被持有 ↓ TTL重新设置为30s
所以只要:
业务线程没结束,锁就不会过期。
三、什么时候不会自动续期
如果你写的是:
lock.lock(10, TimeUnit.SECONDS);
指定了 leaseTime = 10s
这时:
- 不会启用 WatchDog
- 锁 10 秒后必定释放
- 不会自动续期
这是 Redisson 的设计。
总结:
-
lock.lock()→ 有自动续期(WatchDog)
-
lock.lock(10s)→ 没有自动续期
四、为什么要有自动续期
因为业务执行时间 不可预测:
例如:
库存扣减 订单创建 支付回调 调用外部服务
如果锁固定 30 秒:
- 业务执行 40 秒
- 锁提前释放
- 其他线程获得锁
- 并发问题出现
WatchDog 的作用就是:
只要线程还活着,就一直续期。
五、面试常问的一个点
很多面试官会追问:
如果持锁线程宕机,锁会不会一直续期?
答案是:
不会。
因为:
- WatchDog 是 客户端线程
- JVM 挂掉 → WatchDog 也停止
- Redis TTL 不再续期
- 30 秒后锁自动释放
所以不会死锁。