当前位置: 首页 > news >正文

深入解析 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;否则返回0DEL命令则用于删除一个键。

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目录中的文件大多数都提供了关于系统状态的信息&#xff0…...

【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 上播放。 视频转换器允许您将一种视频格式…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

c# 局部函数 定义、功能与示例

C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...