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

【简说八股】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.lryc.cn/news/313097.html

相关文章:

  • WPS/Office 好用的Word插件-查找替换
  • Go 简单设计和实现可扩展、高性能的泛型本地缓存
  • Vue.js 深度解析:模板编译原理与过程
  • Java多线程——如何保证原子性
  • stm32消息和邮箱使用
  • 银行数字化转型导师坚鹏:银行数字化转型案例研究
  • 142.乐理基础-音程的构唱练习
  • 【比较mybatis、lazy、sqltoy、mybatis-flex操作数据】操作批量新增、分页查询(二)
  • 每日OJ题_链表②_力扣24. 两两交换链表中的节点
  • C语言数据类型详解及相关题——各种奇奇怪怪的偏难怪
  • 经典语义分割(二)医学图像分割模型UNet
  • 三天学会阿里分布式事务框架Seata-seata事务日志mysql持久化配置
  • C语言-简单实现单片机中的malloc示例
  • 外包干了2年,技术退步明显
  • 计算机网络面经-HTTPS加密过程
  • 2024年最佳硬盘!为台式电脑、NAS等产品量身定做的顶级机械硬盘
  • 串的匹配算法——BF算法(朴素查找算法)
  • 数据处理分类、数据仓库产生原因
  • 【力扣100】 118.杨辉三角
  • 好物周刊#44:现代终端工具
  • 每日五道java面试题之springMVC篇(一)
  • 【GStreamer】basic-tutorial-4:媒体播放状态、跳转seek操作
  • IPSEC VPN 网关模式实验
  • 想在Vue中使用v-for来循环遍历一组对象,但只循环三次
  • Blazor系统教程(.net8)
  • Day15:技术架构、Maven、Spring Initializer、Spring全家桶、Spring IoC
  • [c/c++] const
  • 生成商品条码
  • langchain学习笔记(十一)
  • LabVIEW高温摩擦磨损测试系统