深入解析 Redisson分布式锁看门狗机制
一、Redisson分布式锁概述
1.1 分布式锁的意义
在分布式系统中,多个节点可能同时访问共享资源,导致数据不一致或竞态条件。分布式锁通过协调不同节点对共享资源的访问,确保数据的一致性和并发访问的安全性。
1.2 Redisson分布式锁的优势
- 基于Redis实现:Redis作为高性能的内存数据库,提供了快速、稳定的存储服务,为Redisson分布式锁提供了坚实的基础。
- 丰富的API:Redisson提供了丰富的Java API,使得分布式锁的使用更加简单、直观。
- 自动续期机制:Redisson的分布式锁支持自动续期,避免了因业务处理时间过长导致的锁过期问题。
- 可重入锁:Redisson的分布式锁支持可重入特性,即同一个线程可以多次获取同一把锁。
二、Redisson分布式锁的原理
2.1 锁的实现方式
Redisson分布式锁主要基于Redis的SETNX(Set if Not Exists)命令和DEL(Delete)命令实现。SETNX命令尝试设置一个值,如果该键不存在,则设置成功并返回1;否则返回0。DEL命令则用于删除一个键。
2.2 看门狗机制
- Redisson通过看门狗(Watch Dog)机制来实现锁的自动续期。当一个没有
leaseTime线程获取锁后,Redisson会立即启动一个后台的定时任务(看门狗)来定期检查锁的状态。 - 看门狗的时间间隔通常是锁默认过期时间(如
30秒)的三分之一(即10秒)。这意味着,在锁的默认过期时间到达之前,看门狗会至少检查两次锁的状态,并在需要时自动续期。 - 如果线程在锁的默认过期时间内完成了操作并释放了锁,看门狗会检测到锁的释放并取消该定时任务,避免不必要的资源消耗。
- 看门狗机制只会针对没有设置
leaseTime的锁;设置了leaseTime的锁不会有看门狗机制,会根据设置的过期时间自然过期。
2.3 锁的自动续期机制
- 当看门狗检测到锁即将过期(即在当前锁的剩余时间小于看门狗的时间间隔)时,它会尝试自动续期。续期操作会延长锁的过期时间,确保在锁还在使用的情况下,其他线程无法获取到该锁。
- 续期的时间长度通常是锁的默认过期时间(如再次设置为30秒),但也可以根据具体需求进行调整。
2.4 锁的释放
当一个线程完成临界区的操作后,应当手动释放锁。在Redisson中,这通常通过调用unlock()方法来完成。如果线程没有手动释放锁,而是异常结束或被其他方式中断,Redis的键空间通知功能可以确保锁在一段时间后自动释放。
三、Redisson 看门狗机制
3.1 参数说明
-
waitTime: 表示在尝试获取锁之前,线程会等待多长时间。当waitTime设置为大于0的值时,线程在尝试获取锁时会在指定的时间内等待。如果在这段时间内锁没有被获取到,tryLock方法将返回false。 -
leaseTime: 表示锁的持有时间,即锁在自动释放之前可以保持多久。 -
unit: 时间单位,用于指定waitTime和leaseTime的时间单位。
3.2 举例几个常见的方法
RLock lock = redissonClient.getLock("lockKey001");// 没设置leaseTime,有看门狗机制lock.tryLock();// 实际调用的RedissonLock的tryLock(long waitTime, TimeUnit unit) // 没设置leaseTime,有看门狗机制lock.tryLock(3, TimeUnit.SECONDS); // 实际调用的RedissonLock的lock(long leaseTime, TimeUnit unit)方法// 设置了leaseTime,有看门狗机制lock.lock(10, TimeUnit.SECONDS);// 设置了leaseTime=10s,没有看门狗机制lock.tryLock(3,10, TimeUnit.SECONDS);
3.3 tryLock()
tryLock() 方法默认会有看门狗机制,因为没有设置过期时间,默认是30s过期,但是看门狗每10s续期一次,每次续期都重新设置过期时间为30s。如果没有释放锁,理论上会无限续期。
3.4 tryLock(long waitTime, TimeUnit unit)
// 源码public boolean tryLock(long waitTime, TimeUnit unit) throws InterruptedException {return this.tryLock(waitTime, -1L, unit);}
因为这个方法没有设置 leaseTime,因此默认也是有看门狗机制的。默认是30s过期,但是看门狗每10s续期一次,每次续期都重新设置过期时间为30s。如果没有释放锁,理论上会无限续期。
3.5 lock(long leaseTime, TimeUnit unit)
设置了 leaseTime 不会有看门狗机制
// 源码public void lock(long leaseTime, TimeUnit unit) {try {this.lockInterruptibly(leaseTime, unit);} catch (InterruptedException var5) {Thread.currentThread().interrupt();}}
3.6 tryLock(long waitTime, long leaseTime, TimeUnit unit)
设置了 leaseTime 不会有看门狗机制
// 源码
public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {long time = unit.toMillis(waitTime);long current = System.currentTimeMillis();...........
}
四、其他
4.1 看门狗生命周期
当一个没有设置leaseTime 的锁一创建 Redisson 就会生成一个对应的看门狗,如果执行了unlock()则看门狗会一起销毁。不然会直到java进程终止(重启、销毁)才会消失。
4.2 看门狗是Redisson 生成的吗
是的,看门狗机制是Redisson 后台启的一个定时任务,不是Redis自带的。
相关文章:
深入解析 Redisson分布式锁看门狗机制
一、Redisson分布式锁概述 1.1 分布式锁的意义 在分布式系统中,多个节点可能同时访问共享资源,导致数据不一致或竞态条件。分布式锁通过协调不同节点对共享资源的访问,确保数据的一致性和并发访问的安全性。 1.2 Redisson分布式锁的优势 …...
Apache Arrow 和数据的未来:开放标准推动人工智能发展
Apache Arrow 是一种开源列式内存格式,适用于平面数据和分层数据。在现代数据湖中,开放数据格式(如 Apache Arrow)位于现代对象存储的存储层中。这些格式成为对象存储中的对象。 在最新版本中,Apache Arrow 宣布计划从…...
Vue项目生产环境的打包优化
Vue项目生产环境的打包优化 前言 在这篇文章我们讨论Vue项目生产环境的打包优化,并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一:删除viser-vue viser-vue底层依赖antv/g2等库一并被删除,…...
oracle数据库之使用Java程序调用存储过程(二十四)
在Oracle数据库中,你可以使用Java程序来调用存储过程。这通常涉及几个步骤:首先,确保你的Java环境能够连接到Oracle数据库;其次,使用JDBC(Java Database Connectivity)来调用存储过程。 以下是…...
西电953总分第一、专业课第一考研上岸
今年上岸西电杭研院网信院网络与信息安全专业,总分370分,专业课116分,分别是总分第一名,专业课第一名,感谢研梦的953叶学姐,非常负责,本硕大佬学姐,当年密码学38分选手(满…...
pytorch-模型训练
目录 1. 模型训练的基本步骤1.1 train、test数据下载1.2 train、test数据加载1.3 Lenet5实例化、初始化loss函数、初始化优化器1.4 开始train和test 2. 完整代码 1. 模型训练的基本步骤 以cifar10和Lenet5为例 1.1 train、test数据下载 使用torchvision中的datasets可以方便…...
Linux /proc目录总结
1、概念 在Linux系统中,/proc目录是一个特殊的文件系统,通常被称为"proc文件系统"或"procfs"。这个文件系统以文件系统的方式为内核与进程之间的通信提供了一个接口。/proc目录中的文件大多数都提供了关于系统状态的信息࿰…...
【JavaEE】浅谈线程(二)
线程 线程的常见属性 线程属性可以通过下面的表格查看。 •ID 是线程的唯⼀标识,不同线程不会重复 • 名称是各种调试⼯具⽤到(如jconsoloe) • 状态表示线程当前所处的⼀个情况,下⾯我们会进⼀步说明 • 优先级高的线程理论上来…...
爬虫:爬取知乎热榜一级评论及回答2024不包含翻页
一、先上结果(注:本文仅为兴趣爱好探究,请勿进行商业利用或非法研究,负责后果自负,与作者无关) 1、爬标题及其具体内容 2、抓标题下的对应回答 3、爬取对应一级评论 二、上流程 1、获取cookies(相信哥哥姐姐…...
AI 编程探索- iOS动态标签控件
需求分析: 标签根据文字长度,自适应标签居中显示扩展 超过内容显示范围,需要换行显示,且保持居中显示 AI实现过程 提问: 回答: import UIKit import SnapKitclass DynamicLabelsContainerView: UIView…...
计算机网络——数据链路层(数据链路层概述及基本问题)
链路、数据链路和帧的概念 数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。 链路(…...
【前端】前端权限管理的实现方式:基于Vue项目的详细指南
前端权限管理的实现方式:基于Vue项目的详细指南 在Web开发中,前端权限管理是一个确保应用安全性和优化用户体验的关键部分。本文将详细介绍前端权限管理的几种实现方式,并通过Vue项目中的代码示例来演示具体实现方法。 前端权限管理的基本实…...
MySQL数据库基础练习系列——教务管理系统
项目名称与项目简介 教务管理系统是一个旨在帮助学校或教育机构管理教务活动的软件系统。它涵盖了学生信息管理、教师信息管理、课程管理、成绩管理以及相关的报表生成等功能。通过该系统,学校可以更加高效地处理教务数据,提升教学质量和管理水平。 1.…...
windowns server2016服务器配置php调用powerpoint COM组件
解决问题:windowns server2016服务器配置php调用powerpoint COM组件 环境: windows server2016 宝塔(nginxmysqlphp7.2) IIS 搭建宝塔: 下载地址:https://www.bt.cn/download/windows.html 安装使用&…...
Git之checkout/reset --hard/clean -f区别(四十二)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
MySQL数据库基础练习系列:科研项目管理系统
DDL CREATE TABLE Users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,gender ENUM(男, 女) NOT NULL COMMENT 性别,email VARCHAR(100) UNIQUE COMMENT 邮箱 …...
算法设计与分析--考试真题
分布式算法试题汇总选择题简答题算法题 2013级试题2019级试题2021年秋考卷 根据考试范围找相应题目做。 分布式算法试题汇总 选择题 下述说法错误的是___ A 异步系统中的消息延迟是不确定的 B 分布式算法的消息复杂性是指在所有合法的执行上发送消息总数的最大值 C 在一个异步…...
【鸿蒙学习笔记】页面和自定义组件生命周期
官方文档:页面和自定义组件生命周期 目录标题 [Q&A] 都谁有生命周期? [Q&A] 什么是组件生命周期? [Q&A] 什么是组件?组件生命周期 [Q&A] 什么是页面生命周期? [Q&A] 什么是页面?页面生…...
ASPICE与ISO 21434:汽车软件与网络安全标准的协同与互补
ASPICE(Automotive SPICE)与ISO 21434在汽车行业中存在显著的相关性,主要体现在以下几个方面: 共同目标: ASPICE和ISO 21434都旨在提高汽车系统和软件的质量、可靠性和安全性。ASPICE关注汽车软件开发过程的成熟度和…...
视频格式转换方法:如何使用视频转换器软件转换视频
众所周知,目前存在许多不同的视频和音频格式。但我们的媒体播放器、移动设备、PC 程序等仅兼容少数特定格式。例如,如果不先将其转换为 MP4、MOV 或 M4V 文件,AVI、WMV 或 MKV 文件就无法在 iPhone 上播放。 视频转换器允许您将一种视频格式…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
中国政务数据安全建设细化及市场需求分析
(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...
