深度解析Redisson框架的分布式锁运行原理与高级知识点
推荐阅读
项目实战:AI文本 OCR识别最佳实践
AI Gamma一键生成PPT工具直达链接
玩转cloud Studio 在线编码神器
玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间
资源分享
史上最全文档AI绘画stablediffusion资料分享
AI绘画关于SD,MJ,GPT,SDXL百科全书
AI绘画 stable diffusion Midjourney 官方GPT文档 AIGC百科全书资料收集
「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间
https://drive.uc.cn/s/2aeb6c2dcedd4
AIGC资料包
https://drive.uc.cn/s/6077fc42116d4
https://pan.xunlei.com/s/VN_qC7kwpKFgKLto4KgP4Do_A1?pwd=7kbv#
分布式系统中的锁管理一直是一个复杂而关键的问
题。在这个领域,Redisson框架凭借其出色的性能和功能成为了开发者的首选之一。本篇博客将深入探讨Redisson框架的分布式锁运行原理以及涉及的高级知识点。通过详细的解释和示例代码,您将更好地理解如何在分布式环境中使用Redisson框架来实现分布式锁。
引言
分布式系统中,多个节点需要协同工作来完成任务,但在某些情况下,为了保证数据的一致性和正确性,需要引入分布式锁。Redisson是一个基于Redis的Java框架,提供了分布式锁的实现,它不仅易于使用,而且性能卓越。在深入探讨Redisson分布式锁的原理之前,我们先了解一下分布式锁的基本概念。
分布式锁的基本概念
分布式锁是一种用于控制分布式系统中多个节点对共享资源的访问的机制。它可以确保在任何给定时刻,只有一个节点可以持有锁,并且只有持有锁的节点可以执行关键代码块。分布式锁通常需要满足以下条件:
- 互斥性:同一时刻只能有一个节点持有锁。
- 可重入性:允许持有锁的节点在释放锁后再次获取锁。
- 安全性:确保即使节点崩溃或网络故障,锁也不会被永久占用。
- 高性能:锁的获取和释放应该是高效的操作。
Redisson框架在满足这些条件的同时,还提供了一些高级功能,使得分布式锁更加强大和灵活。
Redisson框架概述
Redisson是一个基于Redis的Java框架,它提供了多种分布式对象和服务的实现,包括分布式锁、分布式集合、分布式消息队列等。本文主要关注Redisson框架的分布式锁实现。
Redisson的分布式锁不仅仅提供了常规锁的功能,还包括以下特性:
- 可重入锁:同一线程可以多次获取同一个锁。
- 公平锁:基于Redis的有序集合实现,保证等待最久的线程最先获取锁。
- 联锁:支持同时获取多个锁,防止死锁。
- 红锁:在多个Redis节点上获取锁,确保高可用性。
- 读写锁:支持读锁和写锁,允许多个读操作同时进行。
Redisson分布式锁的运行原理
Redisson框架的分布式锁是基于Redis的数据结构实现的,它主要使用了以下两种数据结构:
- Redis的字符串(String):用于存储锁的持有者和锁的有效期。
- Redis的有序集合(Sorted Set):用于实现锁的公平性和释放锁的操作。
下面我们将深入探讨Redisson分布式锁的运行原理:
锁的获取
- 当一个线程尝试获取锁时,Redisson会在Redis中创建一个字符串类型的键值对,键是锁的名称,值是线程的唯一标识(通常是线程ID)。
- 如果获取锁成功,Redisson会设置一个过期时间,以防止锁被长时间占用。过期时间通常使用随机值,以避免锁过期时间冲突。
- 如果获取锁失败,Redisson会等待一段时间,然后重试。这个等待时间通常是随机的,以减少锁争用。
锁的释放
- 当一个线程释放锁时,Redisson会检查锁的持有者是否与当前线程匹配。如果匹配,Redisson会删除锁的键值对,释放锁。
- 如果持有锁的线程在锁过期后仍然未释放锁,其他线程可以尝试获取锁。
锁的公平性
Redisson的公平锁是通过有序集合实现的。每个锁都对应一个有序集合,集合中的成员是等待锁的线程,分数是线程的等待时间戳。获取锁时,Redisson会将线程添加到有序集合中,并按照时间戳排序。当释放锁时,Redisson会从有序集合中移除线程,使等待时间最长的线程获取锁,从而实现公平性。
高级知识点
除了基本的分布式锁原理,Redisson框架还涉及一些高级知识点,这些知识点可以帮助您更好地理解和使用Redisson分布式锁:
1. 联锁
Redisson的联锁允许同时获取多个锁,以避免死锁情况的发生。当多个线程需要获取多个锁时,如果按照相同的顺序获取锁,可以有效地避免死锁。
示例代码:
RBatch batch = redisson.createBatch();
RLock lock1 = batch.getLock("lock1");
RLock lock2 = batch.getLock("lock2");batch.execute();boolean hasLocks = redisson.getLock(lock1, lock2);
if (hasLocks) {try {// 执行需要锁保护的代码} finally {redisson.unlock(lock1, lock2);}
}
在上面的示例中,我们使用了RLock来创建两个锁对象,并使用redisson.getLock()来获取这两个锁。然后,在执行需要锁保护的代码块之前,我们使用redisson.unlock()来释放这两个锁。这样,可以确保在获取多个锁时不会发生死锁。
2. 红锁
Redisson的红锁是一种高可用性的分布式锁,它可以在多个Redis节点上获取锁,以确保即使部分节点故障,也能够正常获取锁。红锁的实现基于Quorum算法,确保在大多数节点可用时才能获取锁。
示例代码:
RRedLock redLock = new RRedLock("lock1", "lock2", "lock3");boolean hasLocks = redLock.tryLock(10, TimeUnit.SECONDS);
if (hasLocks) {try {// 执行需要锁保护的代码} finally {redLock.unlock();}
}
在上面的示例中,我们使用RRedLock来创建一个红锁对象,然后使用redLock.tryLock()来尝试获取锁。如果大多数节点成功获取锁,就会执行锁保护的代码。
3. 读写锁
Redisson支持读写锁,允许多个线程同时读取共享资源,但只允许一个线程写入资源。这在某些场景下可以提高性能。
示例代码:
RReadWriteLock rwLock = redisson.getReadWriteLock("myReadWriteLock");
RLock readLock = rwLock.readLock();
RLock writeLock = rwLock.writeLock();// 获取读锁
readLock.lock();
try {// 执行读操作
} finally {readLock.unlock();
}// 获取写锁
writeLock.lock();
try {// 执行写操作
} finally {writeLock.unlock();
}
在上面的示例中,我们使用RReadWriteLock来创建一个读写锁对象,并分别使用readLock和writeLock来获取读锁和写锁。这样,可以实现多个线程同时读取资源,但只有一个线程能够写入资源。
示例代码演示
下面是一个简单的示例,演示了如何使用Redisson框架来实现分布式锁,以及如何使用高级功能:
public class DistributedLockDemo {public static void main(String[] args) {Config config = new Config();config.useSingleServer().setAddress("redis://localhost:6379");RedissonClient redisson = Redisson.create(config);RLock lock = redisson.getLock("myLock");try {boolean isLocked = lock.tryLock(10, 60, TimeUnit.SECONDS);if (isLocked) {System.out.println("Lock acquired. Performing some critical task...");Thread.sleep(5000); // Simulate some critical taskSystem.out.println("Critical task completed.");} else {System.out.println("Failed to acquire lock. Another process holds it.");}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}redisson.shutdown();}
}
在这个示例中,我们创建了一个Redisson客户端,获取了一个名为"myLock"的锁,然后尝试获取锁并执行关键任务。如果锁被其他线程持有,它将等待一段时间,然后重试。最后,我们释放锁并关闭Redisson客户端。
结论
通过本文的详细解释和示例代码,您现在应该对Redisson框架的分布式锁原理和高级知识点有了更深入的了解。Redisson框架不仅提供了基本的分布式锁功能,还支持可重入锁、公平锁、联锁、红锁、读写锁等高级功能,使得分布式锁的管理变得更加灵活和可靠。
如果您在分布式系统中需要使用分布式锁来管理共享资源的访问,Redisson框架是一个强大且成熟的解决方案。希望本文对您有所帮助,如果您有任何问题或意见,请在下面的评论中分享,让我们一起探讨分布式锁的奥秘!同时,如果您觉得这篇文章对您有帮助,请点赞、评论并分享给更多的开发者。谢谢您的阅读!
相关文章:
深度解析Redisson框架的分布式锁运行原理与高级知识点
推荐阅读 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,MJ,GPT,SDXL百科全书 AI绘画 stable…...
C#扩展方法
参数列表中this的这种用法是在.NET 3.0之后新增的一种特性---扩展方法。通过这个属性可以让程序员在现有的类型上添加扩展方法(无需创建新的派生类型、重新编译或者以其他方式修改原始类型)。 扩展方法是一种特殊的静态方法,虽然是静态方法&a…...
uniapp 高度铺满全屏
问题:在有uni-tabbar的情况下,页面铺满剩下的部分 <template><view :style"{height:screenHeightpx}" class"page"></view> </template> <script>export default {data() {return {screenHeight: &q…...
UG\NX二次开发 判断向量在指定的公差内是否为零,判断是否是零向量 UF_VEC3_is_zero
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 判断向量在指定的公差内是否为零,判断是否是零向量 UF_VEC3_is_zero 效果: 代码: #include "me.hpp"void ufusr(char* param, int* retco…...
2023年MySQL实战核心技术第一篇
目录 四 . 基础架构:一条SQl查询语句是如何执行的? 4.1 MySQL逻辑架构图: 4.2 MySQL的Server层和存储引擎层 4.2.1 连接器 4.2.1.1 解释 4.2.1.2 MySQL 异常重启 解决方案: 4.2.1.2.1. 定期断开长连接: 4.2.1.2.2. 初始…...
hivesql执行过程
语法解析 SemanticAnalyzer SemanticAnalyzer是Hive中的语义分析器,负责检查Hive SQL程序的语义是否正确。SemanticAnalyzer会对Hive SQL程序进行以下检查: 检查过程 语法检查 SemanticAnalyzer会检查Hive SQL程序的语法是否正确,包括关…...
C语言学习:8、深入数据类型
数据超过类型规定的大小怎么办 C语言中,如果需要用的整数大于int类型的最大值了怎么办? 我们知道int能表示的最大数是2147483647,最小的数是-2147483648,为什么? 因为字32位系统中,寄存器是32位的&#…...
生成树协议 STP(spanning-tree protocol)
一、STP作用 1、消除环路:通过阻断冗余链路来消除网络中可能存在的环路。 2、链路备份:当活动路径发生故障时,激活备份链路,及时恢复网络连通性。 二、STP选举机制 1、目的:找到阻塞的端口 2、STP交换机的角色&am…...
【LeetCode】312.戳气球
题目 有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和…...
商业数据分析概论
🐳 我正在和鲸社区参加“商业数据分析训练营活动” https://www.heywhale.com/home/competition/6487de6649463ee38dbaf58b ,以下是我的学习笔记: 学习主题:波士顿房价数据快速查看 日期:2023.9.4 关键概念/知识点&…...
Golang GUI框架
Golang GUI框架fyne fyne简介第一个fyne应用fyne应用程序和运行循环fyne更新GUI内容fyne窗口处理fyne解决中文乱码问题fyne应用打包fyne画布和画布对象fyne容器和布局fyne绘制和动画fyne盒子布局fyne网格grid布局fyne网格包裹布局fyne边框布局fyne表单布局fyne中心布局fyne ma…...
LeetCode刷题笔记【24】:贪心算法专题-2(买卖股票的最佳时机II、跳跃游戏、跳跃游戏II)
文章目录 前置知识122.买卖股票的最佳时机II题目描述贪心-直观写法贪心-优化代码更简洁 55. 跳跃游戏题目描述贪心-借助ability数组贪心-只用int far记录最远距离 45.跳跃游戏II题目描述回溯算法贪心算法 总结 前置知识 参考前文 参考文章: LeetCode刷题笔记【23】…...
游戏出现卡顿有哪些因素
一、服务器CPU内存占用过大会导致卡顿,升级CPU内存或者优化自身程序占用都可以解决。 二、带宽跑满导致卡,可以升级带宽解决。 二、平常不卡,有大型的活动的时候会卡,这方面主要是服务器性能方面不够导致的,性能常说…...
学习Bootstrap 5的第八天
目录 加载器 彩色加载器 实例 闪烁加载器 实例 加载器大小 实例 加载器按钮 实例 分页 分页的基本结构 实例 活动状态 实例 禁用状态 实例 分页大小 实例 分页对齐 实例 面包屑(Breadcrumbs) 实例 加载器 彩色加载器 在 Bootstr…...
vue中自定义指令
什么是指令 在Vue.js中,指令是一种特殊的 token,用于在模板中以声明式方式将响应式数据绑定到 DOM 元素上,从而实现与 DOM 元素的交互和操作。指令以 “v-” 前缀开始,后跟指令的名称,例如 v-model、v-bind 和 v-on。…...
Python:安装Flask web框架hello world
安装easy_install pip install distribute 安装pip easy_install pip 安装 virtualenv pip install virtualenv 激活Flask pip install Flask 创建web页面demo.py from flask import Flask app Flask(__name__)app.route(/) def hello_world():return Hello World! 2023if _…...
小程序点击复制功能制作
在wxml文件中添加一个按钮或需要点击的元素,并绑定点击事件监听器2 <button bindtap"copyText">点击复制</button> 2 在对应的js文件中定义点击事件处理函数,并在函数中调用小程序的API进行复制操作, copyText(e){co…...
20230909java面经整理
1.java常用集合 ArrayList动态数组,动态调整大小,实现List接口 LinkedList双向链表,实现list和queue接口,适用于频繁插入和删除操作 HashSet无序,使用哈希表实现 TreeSet有序,使用红黑树实现 HashMap无序&…...
常用的css命名规则
一、命名规则说明: 1)、所有的命名最好都小写 2)、属性的值一定要用双引号(“”)括起来 3)、给图片加上alt标签 4)、尽量使用英文命名原则 5)、尽量不缩写,除非一看就明白的单词 二、相对网页外…...
【Linux编程Shell自动化脚本】03 shell四剑客(find、sed、grep、awk)
文章目录 一、find1. 常用expression2. 时间参数3. 其他选项参数3.1 查找深度3.2 执行命令 二、sed1. 常用命令选项2. 常用动作脚本命令2.1 s 替换2.2 已匹配字符串标记&2.3 在当前行前后插入文本 a\ 和 i\2.4 p 打印指定行2.5 匹配行的方式2.5.1 以数字形式指定行区间2.5.…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...
运动控制--BLDC电机
一、电机的分类 按照供电电源 1.直流电机 1.1 有刷直流电机(BDC) 通过电刷与换向器实现电流方向切换,典型应用于电动工具、玩具等 1.2 无刷直流电机(BLDC) 电子换向替代机械电刷,具有高可靠性,常用于无人机、高端家电…...
触发DMA传输错误中断问题排查
在STM32项目中,集成BLE模块后触发DMA传输错误中断(DMA2_Stream1_IRQHandler进入错误流程),但单独运行BLE模块时正常,表明问题可能源于原有线程与BLE模块的交互冲突。以下是逐步排查与解决方案: 一、问题根源…...
