【简说八股】Redisson的守护线程是怎么实现的

Redisson

Redisson 是一个 Java 语言实现的 Redis SDK 客户端,在使用分布式锁时,它就采用了「自动续期」的方案来避免锁过期,这个守护线程我们一般也把它叫做「看门狗」线程。

Redission是一个在Java环境中使用的开源的分布式缓存和分布式锁实现,基于Redis数据库。在Redission中,守护线程并不是一个特定的概念,但是它提供了一些功能,可以通过后台线程来实现类似于守护线程的行为。

  1. 后台任务:Redission使用了一些后台任务来维护锁的状态或者其他缓存数据的一致性。例如,Redission会定时检查和更新锁的信息,确保锁在持有者释放后能被正确清理。

  2. 锁自动延期:当使用Redission的锁时,可以设置一个看门狗(watchdog)机制,这是一个后台线程,它会定期检查并延长锁的持有时间。如果在锁自动释放前,业务线程还在执行,看门狗会自动续期锁,防止锁因为业务执行时间过长而被意外释放。

	// 获取锁对象
RLock lock = redisson.getLock("anyLock");
// 尝试获取锁,并设置锁的过期时间,同时开启看门狗进行自动续期
lock.lock(10, TimeUnit.SECONDS);
  1. 事件监听和清理:Redisson 允许设置事件监听器,如锁释放事件。后台线程监听这些事件并进行相关清理工作,确保系统资源有效回收。

以下是实现守护线程行为的几个关键点:

  • setDaemon方法
    Redisson 中没有直接创建 Java 守护线程,但后台任务类似守护线程,会在主线程结束后退出。
  • 资源清理
    当 JVM 关闭或最后一个非守护线程结束时,守护线程负责清理资源,如释放所有锁。
  • 异常处理
    异常"attempt to unlock lock, not locked by current thread by node id"通常表示尝试释放未被当前线程持有的锁,需要在释放锁前检查持有情况。

总结来说,Redission并没有明确地创建Java守护线程,但是它通过后台任务和看门狗机制,实现了守护线程类似的功能,来维护分布式锁和缓存的一致性和可靠性。这些机制保证了即使在高并发和分布式环境下,资源也能被正确管理和清理。

看门狗线程

Redisson 在处理分布式锁时采用了自动续期的机制,通常称为「看门狗」线程。这个看门狗线程负责定期检查并延长锁的持有时间,以避免锁在业务执行过程中过期而被释放。通过看门狗线程的自动续期功能,Redisson 确保了分布式锁在需要时能够持续有效地保持锁定状态。

看门狗机制通常用于分布式系统中的锁管理,特别是在使用分布式锁时非常有用。它的主要作用是定期检查并续期锁的有效时间,以确保在业务处理时间较长或发生异常情况时,锁能够持续有效。

在分布式系统中,由于网络延迟、节点故障等原因,锁的持有时间可能会超出预期,为了避免因此导致锁被意外释放,就需要引入看门狗机制来对锁进行定时续期。具体来说,看门狗机制的工作流程一般包括以下几个步骤:

  1. 锁持有者获取锁后,设置一个自动过期时间(TTL)。
  2. 看门狗定期检查锁的状态,并在接近过期时自动续期锁的持有时间。
  3. 如果锁的持有者因为某种原因无法正常续期锁,看门狗也会负责清理过期的锁,以避免资源泄露。

在 Redisson 中,就采用了看门狗机制来实现分布式锁的自动续期功能。这样一来,在使用分布式锁时,即使业务处理时间较长或发生异常情况,也能够通过看门狗机制确保锁的持续有效,从而提高系统的稳定性和可靠性。

在这里插入图片描述

如想更加深入理解Redis分布式锁,可以仔细看看这篇文章:一文讲透 Redis 分布式锁安全问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch-卷积神经网络

卷积神经网络 基本结构 首先解释一下什么是卷积,这个卷积当然不是数学上的卷积,这里的卷积其实表示的是一个三维的权重,这么解释起来可能不太理解,我们先看看卷积网络的基本结构。 通过上面的图我们清楚地了解到卷积网络和一般网…

【Javascript】设计模式之发布订阅模式

文章目录 1、现实中的发布-订阅模式2、DOM 事件3、简单的发布-订阅模式4、通用的发布-订阅模式5、先发布再订阅6、小结 发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于…

Mysql深入学习 基础篇 Ss.02 详解四类SQL语句

我亲爱的对手,亦敌亦友,但我同样希望你能成功,与我一起,站在人生的山顶上 ——24.3.1 一、DDL 数据定义语言 1.DDL —— 数据库操作 查询 查询所有数据库 show databases; 查询当前数据库 select database(); 创建 create databa…

【简说八股】Nginx、GateWay、Ribbon有什么区别?

前言 在现代的微服务架构中,Nginx、Gateway 和 Ribbon 都是处理网络请求和服务的组件,但它们各自扮演的角色和提供的功能有所不同。下面我将详细解释它们之间的区别: Nginx Nginx 是一个高性能的 HTTP 和反向代理服务器,它也可…

Golang Vs Java:为您的下一个项目选择正确的工具

Java 首次出现在 1995 年,由 James Gosling 和 Sun Microsystems 的其他人开发的一种新编程语言。从那时起,Java 已成为世界上最受欢迎和广泛使用的编程语言之一。Java 的主要特点包括其面向对象的设计、健壮性、平台独立性、自动内存管理以及广泛的内置…

MSMFN

CDFI是彩色多普勒血流成像 辅助信息 作者未提供数据

Codeforces Round 930 (Div. 2)

substr时间复杂度O&#xff08;N&#xff09;&#xff0c;不能一遍遍找&#xff0c;会超时 #include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; const int N5e510; map<string,int>mp; vector<…

[C++]AVL树怎么转

AVL树是啥 一提到AVL树&#xff0c;脑子里不是旋了&#xff0c;就是悬了。 AVL树之所以难&#xff0c;并不是因为结构难以理解&#xff0c;而是因为他的旋转。 AVL树定义 平衡因子&#xff1a;对于一颗二叉树&#xff0c;某节点的左右子树高度之差&#xff0c;就是该节点的…

5、云原生安全之falco的规则解读(部分)(上)

文章目录 1、自定义规则测试1.1、自定义检测定时任务的规则2、自带规则详解部分2.1、意外的出站连接源(类似的还有入站连接)2.2、检测目录穿越攻击2.3、rpm数据库被修改2.4、数据库派生新的进程2.5、特权容器启动2.6、启动容器挂载到敏感路径2.7、匹配所有在pod内启动、并连接…

音视频数字化(数字与模拟-照相机)

目录 1、模拟/数字 2、第一台照相机 3、照相机原理 4、取景方式 5、底片 6、数码相机 7、数码相机指标 8、数码相机分类 (1)单反相机 (2)单电相机 (3)无反相机

2024.03.02蓝桥云课笔记

1.scanf与printf取消分隔符的限制方法 示例代码&#xff1a; int main() { char s[10];scanf("%d[^\n]",s);printf("%s",s);return 0; } 运行&#xff1a; 输入&#xff1a;Hello World 输出&#xff1a;Hello World 注&#xff1a;其中[]中是一个正则…

(UE4升级UE5)Selected Level Actor节点升级到UE5

本问所用工具为&#xff1a;AssetDeveTool虚幻开发常用工具https://gf.bilibili.com/item/detail/1104960041 在UE4中 编辑器蓝图有个节点为 Get Selected Level Actors 但在UE5中&#xff0c;蓝图直接升级后&#xff0c;节点失效&#xff0c;如图&#xff1a; 因为在UE5中&am…

Vue3中Vuex状态管理库学习笔记

1.什么是状态管理 在开发中&#xff0c;我们会的应用程序需要处理各种各样的数据&#xff0c;这些数据需要保存在我们应用程序的某个位置&#xff0c;对于这些数据的管理我们就称之为状态管理。 在之前我们如何管理自己的状态呢&#xff1f; 在Vue开发中&#xff0c;我们使用…

大厂面试经验:如何对加密后的数据进行模糊查询操作

加密后的数据对模糊查询不是很友好&#xff0c;本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路。 为了数据安全我们在开发过程中经常会对重要的数据进行加密存储&#xff0c;常见的有&#xff1a;密码、手机号、电话号码、详细地址、银行卡号、信用卡验证码等信息…

YoloV5改进策略:主干网络改进|MogaNet——高效的多阶门控聚合网络

文章目录 摘要论文:《MogaNet——高效的多阶门控聚合网络》1、简介2、相关工作2.1、视觉Transformers2.2、ViT时代的卷积网络3、从多阶博弈论交互的角度看表示瓶颈4、方法论4.1、MogaNet概述4.2、多阶门控聚合4.3、通过通道聚合进行多阶特征重新分配4.4、实现细节5、实验5.1、…

Vue 3 中的 setup 函数是如何工作的?

Vue 3 中的 setup 函数是一个新的组件选项&#xff0c;用于使用组合式 API 定义组件的逻辑。这个函数的引入是为了解决 Vue 2 中随着组件复杂度的增长&#xff0c;选项式的 API 可能导致代码难以维护和理解的问题。通过 setup 函数&#xff0c;开发者可以更加灵活地组织和共享代…

Python光速入门 - Flask轻量级框架

FlASK是一个轻量级的WSGI Web应用程序框架&#xff0c;Flask的核心包括Werkzeug工具箱和Jinja2模板引擎&#xff0c;它没有默认使用的数据库或窗体验证工具&#xff0c;这意味着用户可以根据自己的需求选择不同的数据库和验证工具。Flask的设计理念是保持核心简单&#xff0c…

布隆过滤器实战

一、背景 本篇文章以解决实际需求的问题的角度进行切入&#xff0c;探讨了如果使用布隆过滤器快速丢弃无效请求&#xff0c;降低了系统的负载以及不必要的流量。 我们都知道布隆过滤器是以占用内存小&#xff0c;同时也能够实现快速的过滤从而满足我们的需求&#xff0c;本篇…

Matlab偏微分方程拟合 | 源码分享 | 视频教程

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

反编译代码格式处理

反编译代码格式处理 背景解决方案程序跑之后idea格式化 总结 背景 想看看公司里一个工具的代码实现&#xff0c;手里只有一个jar包&#xff0c;只能通过jd-gui反编译代码。但是呢&#xff0c;源码是有了&#xff0c;但是看的很难受。 解决方案 /*** 替换 {code searchDir}中…