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

所以不会死锁。

相关推荐
Volunteer Technology10 分钟前
SpringSecurity中的权限管理
java·数据库·servlet
段ヤシ.18 分钟前
回顾Java知识点,面试题汇总Day13:数据库MySQL(持续更新)
java·数据库·mysql
mN9B2uk1733 分钟前
在Qt中使用SQLite数据库
数据库·qt·sqlite
network_tester1 小时前
SENT/PSI5传感器TSN集成测试:打通传统传感与未来车载网络的“最后一公里”
数据库·网络协议·tcp/ip·自动驾驶·信息与通信·信号处理·tcpdump
桌面运维家1 小时前
校园机房vDisk IDV云桌面建设方案价格参考
linux·服务器·数据库
moonsims1 小时前
基于Lattice Mesh的AI 的分布式共识与动态任务分配架构的无人机群“去中心化无声协同”技术和极低带宽下的韧性通信技术
人工智能·分布式·架构
念越1 小时前
SQL 基础语法复习
数据库·sql·数据库系统概论
ULIi096kr1 小时前
MySQL磁盘爆满快速排查方案:一键查询库表空间、定位占用大户(RDS/自建通用)
数据库·mysql
华山令狐虫1 小时前
告别手写 SQL——DBAPI 企业版 v4.6.0 推出 AI 助手
数据库·人工智能·sql·dbapi
Cx330❀1 小时前
【MySQL基础】库与表的全面操纵指南
linux·服务器·网络·数据库·c++·mysql