关于Redisson分布式锁的用法

关于Redisson分布式锁的用法

Redisson是一个基于Redis的Java分布式对象和服务框架,它提供了多种分布式锁的实现,包括可重入锁、公平锁、读写锁等。Redisson实现分布式锁的核心原理主要依赖于Redis的数据结构和Redisson框架提供的高级功能。以下详细讲解Redisson如何实现分布式锁:

1. 数据结构选择

Redisson分布式锁主要使用了Redis的字符串(String)数据结构来存储锁的标识和过期时间。对于公平锁,Redisson还利用了Redis的有序集合(Sorted Set)来记录等待锁的线程,以实现锁的公平分配。

2. 锁的获取

当一个线程尝试获取锁时,Redisson会执行以下步骤:

  • 创建键值对:在Redis中创建一个字符串类型的键值对,键是锁的名称,值是线程的唯一标识(通常是线程ID)和重入次数(如果支持可重入锁)。
  • 设置过期时间:为了防止死锁,Redisson会在设置键值对的同时设置一个过期时间。如果线程在过期时间内没有释放锁,锁将自动释放。
  • 检查锁状态:Redisson会检查Redis中是否已经存在该锁的键值对。如果不存在,则当前线程成功获取锁;如果存在且锁的持有者不是当前线程,则当前线程需要等待或尝试其他方式获取锁。

3. 可重入锁的实现

Redisson支持可重入锁,即同一个线程可以多次获取同一个锁。Redisson通过以下方式实现可重入锁:

  • 记录重入次数:在锁的键值对中,除了存储线程ID外,还存储了重入次数。每次线程获取锁时,如果锁的持有者是当前线程,则将重入次数加1。
  • 释放锁:当线程释放锁时,Redisson会检查重入次数。如果重入次数大于1,则将重入次数减1并重新设置过期时间;如果重入次数为0,则删除键值对,彻底释放锁。

4. 锁的续期

为了防止业务逻辑执行时间过长导致锁自动释放,Redisson提供了锁续期的功能。在获取锁成功后,Redisson会启动一个定时任务(通常称为“看门狗”),该任务会定期检查锁的状态,并在锁即将过期时重置过期时间,从而延长锁的有效期。

5. 锁的竞争与等待

当多个线程同时请求获取同一个锁时,可能会出现锁竞争的情况。Redisson通过以下几种方式处理锁竞争:

  • 自旋等待:线程在获取锁失败后会进入自旋等待状态,不断尝试获取锁,直到获取成功或超过设定的超时时间。
  • 信号量机制:Redisson还利用Redis的发布/订阅功能(Pub/Sub)和信号量机制,实现等待锁的线程之间的通信和唤醒。当锁被释放时,持有锁的线程会向等待队列中的线程发送信号,通知它们重新尝试获取锁。

6. 公平锁的实现

对于公平锁的实现,Redisson利用了Redis的有序集合。每个锁都对应一个有序集合,集合中的成员是等待锁的线程,分数是线程的等待时间戳。当线程尝试获取锁时,Redisson会将线程添加到有序集合中,并按照时间戳排序。当锁被释放时,Redisson会从有序集合中移除线程,并让等待时间最长的线程获取锁,从而实现公平性。

7. Redisson的高级特性

除了基本的分布式锁实现外,Redisson还提供了许多高级特性,如联锁(同时获取多个锁以避免死锁)、红锁(基于多个Redis节点实现的高可用性分布式锁)和读写锁(允许多个线程同时读取资源但只允许一个线程写入资源)等。这些特性使得Redisson在分布式系统中的应用更加灵活和强大。

7.1 联锁(MultiLock)

Redisson的联锁机制允许一个线程同时获取多个锁,从而避免死锁的发生。联锁是通过将多个独立的锁组合成一个逻辑上的锁来实现的。当一个线程请求联锁时,Redisson会依次尝试获取每一个独立的锁,只有在所有锁都成功获取后,联锁才会被视为成功获取。否则,Redisson会释放已经获取的锁并进行重试,直到所有锁都被成功获取或达到重试次数上限。

7.2 红锁(RedLock)

红锁是一种高可用的分布式锁实现,基于Redis的多个独立节点来保证锁的可靠性。Redisson的红锁机制遵循RedLock算法,即在N个Redis节点上创建同一个锁,且只要超过一半的节点(即N/2+1个节点)成功创建了锁,当前线程就视为成功获取了锁。这样即使部分节点发生故障,分布式锁依然能够可靠地工作。

7.3 读写锁(ReadWriteLock)

读写锁允许多个线程同时读取资源,但只允许一个线程写入资源。Redisson通过将读锁和写锁分开实现这种机制:

  • 读锁:多个线程可以同时获取读锁,不会互相阻塞。
  • 写锁:当有线程持有写锁时,其他线程的读锁和写锁请求都会被阻塞,直到写锁被释放。

这种机制提高了并发读取的性能,同时保证了写操作的独占性,适用于读多写少的场景。

7.4 信号量(Semaphore)

Redisson的信号量实现允许多个线程根据许可数量来访问共享资源。信号量初始化时会设置一个许可数量,当线程请求信号量时,如果还有剩余许可,线程即可获取信号量并继续执行;否则,线程会进入等待状态,直到有其他线程释放信号量。

7.5 可过期的计数器(CountDownLatch)

Redisson的可过期计数器允许一个或多个线程等待其他线程执行完成后再继续执行。计数器初始化时会设置一个计数值,表示需要等待的事件数量。每当一个事件完成时,计数器的值就会减少。当计数器值变为0时,所有等待的线程会被唤醒继续执行。

7.6 可过期的桶(Bucket)

Redisson的可过期桶是一种具有过期时间的数据结构,可以存储任何类型的对象。桶在存储对象时可以指定过期时间,过期后对象会自动删除。可过期桶适用于需要临时存储数据的场景,如缓存数据、会话数据等。

参考链接

  • Redisson GitHub项目:https://github.com/redisson/redisson
  • Redis官方文档:https://redis.io/documentation
  • Redisson Wiki:https://github.com/redisson/redisson/wiki
  • Redis分布式锁实现介绍:https://redis.io/topics/distlock

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于RK3588的GMSL、FPDLink 、VByone及MIPI等多种摄像模组,适用于车载、机器人工业图像识别领域

机器人&工业摄像头 针对机器人视觉与工业检测视觉,信迈自主研发和生产GMSL、FPDLink 、VByone及MIPI等多种摄像模组,并为不同应用场景提供多种视场角度和镜头。拥有资深的图像算法和图像ISP专家团队,能够在软件驱动层开发、ISP算法、FPG…

sql-语句

文章目录 SQL语句的学习sql是什么sql的内置命令sql的种类sql mode库,表属性介绍:字符集,存储引擎列的数据类型:数字,字符串,时间列的约束DDL: 数据定义语言库表 Online DDL(ALGORITHM) *DML :数据操纵语言资…

算法:链表

目录 链表的技巧和操作总结 常用技巧: 链表中的常用操作 题目一:反转一个单链表 题目二:链表的中间结点 题目三:返回倒数第k个结点 题目四:合并两个有序链表 题目五:移除链表元素 题目六&#xff…

033基于SSM+Jsp的多用户博客个人网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

GPIO和PIN

文章目录 1 GPIO和Pin1.1 GPIO和Pin基础概念1.2 GPIO输入模式1.3 GPIO输出模式1.4 GPIO的HAL库1.4.1 一些HAL库表示1.4.2 HAL库常用GPIO函数1.4.3 GPIO点亮led灯程序例子 1 GPIO和Pin 1.1 GPIO和Pin基础概念 ​ 单片机有很多的引脚,为了操控每一个引脚&#xff0c…

JVM原理(四):JVM垃圾收集算法与分代收集理论

从如何判定消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”和“追踪式垃圾收集”两大类。 本文主要介绍的是追踪式垃圾收集。 1. 分代收集理论 当代垃圾收集器大多遵循“分代收集”的理论进行设计,它建立在两个假说之上: 弱分…

Git企业开发---初识Git

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 引言 不知道大家有没有经历这种困惑,当我们要去交某文档时,总是要进行修改,修改后再交…

【知识学习】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一个强大的可视化Shader编辑工具,它允许用户通过拖拽和连接节点的方式来创建Shader,而不是通过传统的编写代码的方式。Shader Graph使得Shader的创建过程更加直观和易于理解,特别是对于那些不熟悉Shader语言编程的美…

19.《C语言》——【如何理解static和extern?】

🎇开场语 亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能&a…

MDA管理层讨论与分析内容信息披露情感分析数据(2010-2022年)

数据简介:MD&A通常是指管理层讨论与分析(Management Discussion & Analysis),是上市公司年报中一个重要的部分,主要包含公司经营业绩的讨论,以及未来前景的预测等。MD&A可以帮助投资者更好地理…

leetcode 第133场双周赛 100333.统计逆序对的数目【计数dp/滚动数组/前缀和优化】

分析: 先考虑如下问题。 求长度为n,逆序对为m的排列数量。 可以考虑dp,dp[i][j]定义为长度为i,逆序对为j的排列数量。 dp[1][0] 1; //枚举排列长度,或者认为枚举当前需要插到长度为i-1的排列中的数字 for(int i 1…

笔记本电脑安装CentOS

正文共:1234 字 24 图,预估阅读时间:2 分钟 前面我们对VPP进行了多次介绍(羡慕!大佬的VPP能达到180G性能,而我的却只有13.5G),可以发现他的很多优点,但是我们也可以发现它…

socket编程常见操作

1、连接的建立 分为两种:服务端处理接收客户端的连接;服务端作为客户端连接第三方服务 //作为服务端 int listenfd socket(AF_INET, SOCK_STREAM, 0); bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) listen(listenfd, 10); //…

【单片机毕业设计11-基于stm32c8t6的智能水质检测】

【单片机毕业设计11-基于stm32c8t6的智能水质检测】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 🔥这里是小殷学长,单片机毕业设计篇11基于stm32的智能水质检测系统 🧿创作不易,拒绝白嫖可私 一、功能介绍 -------------…

武汉星起航:亚马逊欧洲站潮流指南,满足年轻人选品需求

在充满活力的20-30岁年龄段,年轻人们充满朝气,追求时尚与品质,对生活充满无限期待。亚马逊欧洲站作为全球领先的电商平台,为这一年龄段的人群提供了丰富多样的商品选择。武汉星起航将为您介绍亚马逊欧洲站针对20-30岁人群的选品攻…

三元表达式解析器

题意:其实本质上就是三目运算 ,只不过跟我们以往的三目运算不同的是,这一系列的运算可以把T 和 F 都参与到运算中。设x5 表达式 x>2?T:F 最终返回T. 思路: 1.从后往前遍历字符数组 2.如果遇到的是 非?和 非&…

C++:静态断言内存对齐

静态断言 C中的断言assert (1)直接参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (2)C的assert是运行时检测发现错误,而不是编译时 (3)C在编译时错误用#error来输出C静态断言 (1)C引入static_assert(表达式, “提示字符串”)来实现编译时的静…

华为手机改变休眠时间 不让手机动不动黑屏

在手机中找到设置 并打开 在里面找到显示与亮度 并点开 找到并点击休眠操作项 然后就会弹出 多久进入休眠 可以调久一点

LeetCode 1527, 54,114

目录 1527. 患某种疾病的患者题目链接表要求知识点思路代码 54. 螺旋矩阵题目链接标签思路代码 114. 二叉树展开为链表题目链接标签前序遍历思路代码 前驱思路代码 1527. 患某种疾病的患者 题目链接 1527. 患某种疾病的患者 表 表Patients的字段为patient_id、patient_name…

等保测评练习16

等级保护初级测评师试题16 姓名: 成绩: 一、判断题(10110分) 1.虚拟机被非法利用后,可能被当作跳板机。(T) P312 2.云服务商,为云计算服务…