深度解析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.…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...