Redis 分布式锁自动续期机制

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 秒后锁自动释放

所以不会死锁。

相关推荐
用户30745969820715 小时前
Redis 延时队列详解
redis
GBASE15 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
烤代码的吐司君18 小时前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
xiezhr1 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩2 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3503 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3503 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3503 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
leeyi3 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent