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

所以不会死锁。

相关推荐
摇滚侠18 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
川石课堂软件测试19 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
凯凯姜19 小时前
分布式锁场景问题
分布式
2501_9377671619 小时前
自建 SQL 数据库定时备份踩坑复盘与落地思路
数据库·sql
silvamux_21 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
夕除1 天前
redis--模型
redis
每天一道题1 天前
CAP、Raft 与多数派:分布式系统如何达成一致?
分布式·后端·微服务
I Am a robert girl1 天前
从 GameHorizon 拆解多时间尺度游戏评测:数据管线、离线基准与在线回放的三层设计
数据库·游戏·多时间尺度·数据管线·游戏评测·离线基准·在线回放
躺柒1 天前
读数据安全架构设计与实践17安全架构案例(下)
数据库·安全·零信任·安全架构·防火墙·无边界
SelectDB1 天前
实时更新排错现场:导入了却查到旧数据,和 FINAL 越加越慢的两条路
大数据·数据库·数据分析