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

所以不会死锁。

相关推荐
TDengine (老段)12 分钟前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
汉知宝科技13 分钟前
历史案件数据迁移:知识产权管理系统落地的第一道门槛
大数据·数据库
这就是佬们吗23 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
吴声子夜歌24 分钟前
MongoDB 4.x——SpringBoot框架整合
数据库·spring boot·mongodb
昕光xg32 分钟前
Istio笔记04-基于Jaeger的分布式链路追踪
笔记·分布式·istio
Database_Cool_1 小时前
阿里云 Tair(企业级内存数据库)vs 腾讯云 Redis 云缓存深度对比:性能/数据结构/成本全维度 Benchmark
数据库·阿里云·缓存
流星白龙1 小时前
【Redis】1.Redis特性
数据库·redis·缓存
奶糖 肥晨1 小时前
DBeaver 安装与 MySQL 连接配置教程
数据库·mysql
woshihuanglaoshi1 小时前
数据迁移与版本管理 - Flutter在鸿蒙平台实现数据库升级策略
数据库·学习·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
java_logo3 小时前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris