Redisson的看门狗机制
​​​​​​​Redisson的看门狗机制原理Redisson看门狗机制相关背景Redis分布式锁的看门狗机制是Redisson为解决‌业务执行时间超过锁过期时间、锁提前释放引发并发安全问题‌设计的自动续期机制。下图展示了Redisson看门狗机制的核心运行流程flowchart TD A[业务线程调用 lock() 或 tryLock()] -- B{是否指定 leaseTime?} B -- 是 -- C[手动指定过期时间 看门狗不生效] B -- 否 -- D[获取锁成功 设置初始TTL30秒] D -- E[启动看门狗定时任务] E -- F{定时检查每10秒} F -- 锁仍被当前线程持有 -- G[执行Lua脚本续期 重置TTL为30秒] G -- F F -- 锁已释放或线程不持有 -- H[停止续期] C -- I[业务执行完成] D -- I I -- J[调用 unlock() 释放锁] J -- K[看门狗任务终止] L[客户端进程宕机] -- M[看门狗任务终止] M -- N[锁在最后一次续期后30秒自动过期]流程说明获取锁业务线程调用lock()或tryLock()且不指定leaseTime时Redisson会为锁设置默认30秒的初始TTL。启动定时任务后台立即启动基于Netty时间轮的看门狗定时任务。定期检查与续期每10秒TTL的1/3检查一次锁状态。若锁仍被当前线程持有则通过Lua脚本原子性地将锁的TTL重置为30秒。循环续期只要业务未完成且未调用unlock()续期动作就会持续循环防止锁过期。停止条件业务正常完成调用unlock()释放锁看门狗任务立即终止。客户端进程宕机看门狗任务随之终止锁在最后一次续期后30秒自动过期避免永久死锁。Redisson看门狗机制相关背景Redis分布式锁的看门狗机制是Redisson为解决‌业务执行时间超过锁过期时间、锁提前释放引发并发安全问题‌设计的自动续期机制。1. 核心生效前提只有调用tryLock()时未手动指定锁的租约时间传入leaseTime-1看门狗才会自动启动若手动设置了过期时间Redisson会认为用户自行管控锁生命周期不会触发看门狗逻辑。2. 基础运行原理锁初始化时默认给锁设置‌30秒‌的初始TTL该默认值可通过配置修改。后台启动基于Netty时间轮的轻量定时任务每10秒默认TTL的1/3检查一次锁状态若锁仍被当前线程持有就通过Lua脚本将锁的过期时间重置为30秒。只要业务线程未执行完、未调用unlock()释放锁续期动作就会循环持续避免锁提前过期。3. 停止续期的触发条件业务正常执行完成主动调用unlock()删除锁看门狗任务直接终止。客户端进程宕机看门狗定时任务随之终止锁会在最后一次续期后的30秒自动过期释放不会出现永久死锁。4. 底层实现细节看门狗的续期逻辑通过Lua脚本原子执行先校验锁是否仍被当前线程持有确认后再重置过期时间避免误续其他线程持有的锁保证续期操作的线程安全。Spring Boot 整合 Redis 实现看门狗机制完整示例1. 环境准备Maven 依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdorg.redisson/groupId artifactIdredisson-spring-boot-starter/artifactId version3.27.0/version /dependencyapplication.yml 配置spring: redis: host: localhost port: 6379 # 密码如有 # password: yourpassword redisson: 单节点配置 single-server-config: address: redis://${spring.redis.host}:${spring.redis.port} # 连接池大小 connection-pool-size: 64 # 连接最小空闲数 connection-minimum-idle-size: 24 # 连接超时时间毫秒 connect-timeout: 10000 # 命令等待超时时间毫秒 timeout: 30002. Redisson 配置类import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class RedissonConfig { Value(${spring.redis.host}) private String redisHost; Value(${spring.redis.port}) private int redisPort; Bean public RedissonClient redissonClient() { Config config new Config(); // 使用单节点模式 config.useSingleServer() .setAddress(redis:// redisHost : redisPort) // 看门狗默认锁超时时间毫秒默认 30000 .setLockWatchdogTimeout(30000) // 连接池配置 .setConnectionPoolSize(64) .setConnectionMinimumIdleSize(24) .setConnectTimeout(10000) .setTimeout(3000); return Redisson.create(config); } }3. 分布式锁服务类import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; Service public class DistributedLockService { Autowired private RedissonClient redissonClient; /** 获取锁启用看门狗自动续期 param lockKey 锁的key return 锁对象 */ public RLock lockWithWatchdog(String lockKey) { RLock lock redissonClient.getLock(lockKey); // 不传 leaseTime 或传 -1看门狗自动生效 lock.lock(); return lock; } /** 尝试获取锁启用看门狗自动续期 param lockKey 锁的key param waitTime 等待时间秒 return 是否获取成功 */ public boolean tryLockWithWatchdog(String lockKey, long waitTime) throws InterruptedException { RLock lock redissonClient.getLock(lockKey); // leaseTime 传 -1看门狗自动生效 return lock.tryLock(waitTime, -1, TimeUnit.SECONDS); } /** 获取锁手动指定过期时间不启用看门狗 param lockKey 锁的key param leaseTime 锁的持有时间秒到期自动释放 return 锁对象 */ public RLock lockWithLeaseTime(String lockKey, long leaseTime) { RLock lock redissonClient.getLock(lockKey); // 指定 leaseTime看门狗不生效 lock.lock(leaseTime, TimeUnit.SECONDS); return lock; } /** 释放锁 param lock 锁对象 */ public void unlock(RLock lock) { if (lock ! null lock.isLocked() lock.isHeldByCurrentThread()) { lock.unlock(); } } }4. 业务使用示例import org.redisson.api.RLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.concurrent.TimeUnit; Service public class OrderService { Autowired private DistributedLockService lockService; private static final String ORDER_LOCK_PREFIX order:lock:; /** 创建订单使用看门狗保证长任务锁安全 */ public void createOrderWithWatchdog(Long orderId) { String lockKey ORDER_LOCK_PREFIX orderId; RLock lock null; try { // 获取锁看门狗自动续期 lock lockService.lockWithWatchdog(lockKey); // 或者使用 tryLock同样启用看门狗 // boolean locked lockService.tryLockWithWatchdog(lockKey, 5); // if (!locked) { // throw new RuntimeException(获取锁失败); // } // 模拟耗时业务操作可能超过30秒 TimeUnit.SECONDS.sleep(40); System.out.println(订单创建成功订单ID: orderId); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(订单创建被中断, e); } finally { // 释放锁看门狗任务终止 lockService.unlock(lock); } } /** 快速操作手动指定过期时间不启用看门狗 */ public void quickOperation(Long resourceId) { String lockKey resource:lock: resourceId; RLock lock null; try { // 获取锁10秒后自动过期 lock lockService.lockWithLeaseTime(lockKey, 10); // 快速业务操作 TimeUnit.SECONDS.sleep(5); System.out.println(快速操作完成资源ID: resourceId); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(操作被中断, e); } finally { // 锁会在10秒后自动释放也可手动释放 lockService.unlock(lock); } } }5. 测试控制器import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; RestController public class LockTestController { Autowired private OrderService orderService; /** 测试看门狗机制 */ GetMapping(/order/create/{orderId}) public String createOrder(PathVariable Long orderId) { try { orderService.createOrderWithWatchdog(orderId); return 订单创建成功订单ID: orderId; } catch (Exception e) { return 订单创建失败: e.getMessage(); } } /** 测试手动过期锁 */ GetMapping(/resource/operate/{resourceId}) public String operateResource(PathVariable Long resourceId) { try { orderService.quickOperation(resourceId); return 资源操作成功资源ID: resourceId; } catch (Exception e) { return 资源操作失败: e.getMessage(); } } }6. 关键配置说明lockWatchdogTimeout看门狗检查间隔默认30000毫秒30秒。看门狗会在锁过期前1/3时间10秒进行检查和续期。leaseTime参数调用lock(leaseTime, unit)或tryLock(waitTime, leaseTime, unit)时如果leaseTime 0看门狗不生效如果leaseTime -1或不传看门狗生效。锁释放业务完成后必须调用unlock()否则看门狗会持续续期直到进程终止。7. 注意事项看门狗机制只在使用Redisson的RLock接口且未指定leaseTime时生效。确保Redis连接稳定网络波动可能导致续期失败锁提前释放。生产环境建议配置Redis哨兵或集群模式提高可用性。监控锁的持有时间避免业务逻辑异常导致锁长期占用。

相关新闻

不同系统下设置静态IP

不同系统下设置静态IP

虽然所有 Linux 系统在底层的内核操作是相同的(临时配置都可以用 ip 或 ifconfig),但让静态 IP 永久生效的配置文件格式、路径以及后台网络管理服务,在不同操作系统中截然不同。各大常见系统设置静态 IP 的机制对比与操作示例说明…

2026/7/24 20:14:34阅读更多 →
3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案

3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案

3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-e…

2026/7/24 20:14:34阅读更多 →
�鸿蒙报错速查:arkts-limited-stdlib __proto__ 原型链访问,用了就炸,根因 + 真解法

�鸿蒙报错速查:arkts-limited-stdlib __proto__ 原型链访问,用了就炸,根因 + 真解法

报错原文 ERROR: 10505001 ArkTS Compiler Error Error Message: Property __proto__ does not exist on type Object. At File: xxx.ets:N:N常伴生报错: Error Message: Usage of standard library is restricted (arkts-limited-stdlib)报错触发场景 你写鸿蒙 Ark…

2026/7/24 20:14:34阅读更多 →
大模型记忆系统:从短期记忆到长期存储的技术演进

大模型记忆系统:从短期记忆到长期存储的技术演进

1. 大模型记忆能力概述:从"金鱼脑"到"最强大脑"的进化之路作为一名长期奋战在AI应用一线的开发者,我深刻体会过大模型"健忘"带来的困扰。去年在开发客服对话系统时,客户反复抱怨:"每次都要重新…

2026/7/24 23:17:07阅读更多 →
从「能纠错」到「算得起」:量子计算真正的考验才刚刚开始

从「能纠错」到「算得起」:量子计算真正的考验才刚刚开始

文丨恩里科 排版丨恩里科 行业动向:4200字丨12分钟阅读 内容提要 在此前的文章容错跨过门槛:微软与 Quantinuum 取得量子纠错重大进展(内附Nature下载)当中,我们讲述了纠错领域的突破:微软与 Quantinuum…

2026/7/24 23:17:07阅读更多 →
给 AI Agent 的 Skill 装上”自我进化”引擎:一套可落地的优化闭环方案

给 AI Agent 的 Skill 装上”自我进化”引擎:一套可落地的优化闭环方案

本文整理自 Warp 创始人 Zach Lloyd 分享的一个工程实践:如何用”观察者 Skill”自动评估并迭代改进另一个 Skill,让 Agent 的能力越用越强,而不是一次性交付后就放在那里”等老化”。 一、为什么 Skill 需要”自优化” 如果你已经在用 Clau…

2026/7/24 23:17:07阅读更多 →
爽提:以“高效智能”赋能“高校传统”食堂运营转型升级

爽提:以“高效智能”赋能“高校传统”食堂运营转型升级

在来势汹涌的社会外卖冲击下,传统的高校食堂餐饮运营从单一的线下经营转向“线上线下”多渠道融合餐饮业态、实现智能化升级已成大势所趋。但食堂商户要想真正实现智能化运营转型,必然离不开能够联结线上与线下的并且以其方便、快捷、高效而远超传统餐饮…

2026/7/24 23:17:07阅读更多 →
【详细】FreeRTOS任务的内部机制

【详细】FreeRTOS任务的内部机制

一.结构体volatile StackType_t * pxTopOfStack:保存当前任务堆栈的栈顶指针。ListItem_t xStateListItem:用于将任务挂接到各种调度状态链表中。ListItem_t xEventListItem:当任务因等待某个同步/通信对象(队列、信号量、互斥量、…

2026/7/24 23:17:07阅读更多 →
基于HarmonyOS的AI春联对联生成——从对齐到评估的全流程技术实践

基于HarmonyOS的AI春联对联生成——从对齐到评估的全流程技术实践

基于HarmonyOS的AI春联对联生成——从对齐到评估的全流程技术实践 一、项目背景与需求分析(Align) 1.1 场景痛点分析 在现代数字生活中,用户对春联对联生成的需求日益增长。传统的春联对联生成方式存在效率低下、个性化不足等问题。通过AI技术…

2026/7/24 23:15:07阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →