Redisson分布式锁

news2025/2/1 15:58:49

Redisson分布式锁

Redisson 是什么?

Redisson是一个Java库,它为Redis服务器提供分布式和可扩展的Java对象和服务(Set、Multimap、SortedSet、Map、Lock、Semaphore、CountDownLatch、Publish/Subscribe、Bloom filter等)。它允许您将Redis服务器用作Java对象缓存、消息代理或分布式Java对象存储。

Redisson的一个常见用例是将其用作分布式锁管理器。分布式锁管理器是允许分布式进程同步访问共享资源的软件组件。分布式锁管理器可用于确保一次只有一个进程可以访问资源,这对于防止竞争条件和其他类型的同步问题非常有用。

要将Redisson用作分布式锁管理器,可以使用RLock接口,该接口提供获取、释放和更新锁的方法。例如,以下代码片段显示了如何使用Redisson获取和释放锁:

// Create a RedissonClient instance
RedissonClient redisson = Redisson.create();

// Get a lock instance
RLock lock = redisson.getLock("myLock");

// Acquire the lock
lock.lock();

try {
    // Access the shared resource
} finally {
    // Release the lock
    lock.unlock();
}

Redisson还提供其他类型的锁,如ReadWriteLock和PermitExpirableSemaphore,它们可以用于不同类型的同步场景。

Redisson加锁的过程

要使用Redisson获取锁,可以使用RLock接口的lock()方法。此方法将阻塞,直到获取锁,或者直到获取锁超时(如果指定了超时)。

例如,以下代码片段显示了如何获取超时为10秒的锁:

// Create a RedissonClient instance
RedissonClient redisson = Redisson.create();

// Get a lock instance
RLock lock = redisson.getLock("myLock");

// Try to acquire the lock within 10 seconds
boolean locked = lock.tryLock(10, TimeUnit.SECONDS);

if (locked) {
    try {
        // Access the shared resource
    } finally {
        // Release the lock
        lock.unlock();
    }
} else {
    // Lock acquisition timed out
}

如果您想在不阻塞的情况下获取锁(即,如果锁不可用,您想立即返回),可以使用tryLock()方法,该方法返回一个布尔值,指示是否获取了锁。

您还可以指定锁的租用时间,即释放后锁将保持锁定的时间。如果您希望确保锁在释放后不会立即被另一个进程重新获取,那么这将非常有用。要指定租赁时间,可以使用lock(long leaseTime,TimeUnit单位)或tryLock(long waitTime,long leaseTime,TimeUnit单元)方法。
加锁的过程图:
在这里插入图片描述从上图可知:
1、应用1想要拿到锁,首先去redis看一下lck_acc_000里面的map,value是不是0,如果为0表示锁可以使用。

2、应用1拿到锁之后,需要上锁,上锁是通过Lua脚本(保证原子性)实现。

3、上锁之后value变为1。

4、应用2也想要lck_acc_000的锁,但是value为1,应用2可以自旋等待锁,也可以直接返回,应用2也可以拿到锁还有多久时间释放。

5、锁默认的失效时间为30秒,应用1可能执行时间大于30秒,执行过程释放锁这是不讲武德的。

6、所以应用1有一个watch dog看门狗,看门狗没过10秒就会把失效时间延续到30秒。

Redisson释放锁的过程

在这里插入图片描述1、调用unlock方法会释放锁
2、redis上的value表示重入次数,重入:比如方法A调用方法B,A和B都使用了锁L,那么锁过程变为A.Lock -> B.Lock -> B.UnLock -> A.UnLock ,B加锁时value会变为2,表示重入了一次,B释放锁value减1,当value为0时表示锁被释放

Redisson锁的优劣

在某些情况下,使用像Redisson这样的分布式锁管理器可能会很有用,因为您需要跨多个进程或线程同步对共享资源的访问。使用Redisson进行分布式锁定的一些潜在好处包括:

1、可扩展性:Redisson设计用于分布式系统,可以通过向集群中添加更多Redis服务器来横向扩展。这使得它适合在高并发环境中使用。

2、容错:即使一个或多个Redis服务器宕机,Redison也可以自动从故障中恢复并保持锁定状态。

3、易用性:Redisson为获取、释放和更新锁提供了一个简单的API,并支持针对不同同步场景的各种类型的锁(例如,读/写锁、信号量)。

然而,在使用Redison进行分布式锁定时,也有一些潜在的缺点需要考虑:

1、性能:获取和释放锁可能是一项相对昂贵的操作,尤其是当需要在多个Redis服务器上更新锁状态时。这会影响应用程序的性能,尤其是在高并发环境中。

2、复杂性:使用像Redisson这样的分布式锁管理器可能会给应用程序带来额外的复杂性,因为您需要仔细管理锁状态并处理故障和超时。

3、单点故障:如果Redisson依赖的Redis服务器宕机,锁管理器将无法运行。这可以通过使用Redis Sentinel或Redis Cluster实现高可用性来缓解,但这仍然是一个需要考虑的潜在风险。

上面是人工智能ChatGpt说的,下面是人说的:
优点:
1、支持可重入
2、不依靠redis本身的实现,即不依靠setNX
缺点:
1、实现复杂
2、存在分布式问题:比如说redis一主一从,应用1拿到锁,value设置为1,然后主挂了value=1还没同步,从提升为主,但是加锁信息没有同步过来value还是为0,应用2发现value为0拿到锁,这就会造成两个应用拿到锁的情况。可以使用RedLock解决(存在争议)。

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

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

相关文章

工控安全-S7协议

文章目录一、西门子PLC系统构成二、S7协议结构三、TPKT协议四、COTP协议4.1 COTP连接包4.2 COTP功能包五、S7Comm协议5.1 头(Header)5.2 作业请求(Job)和确认数据响应(Ack_Data)5.2.1 建立通信(Setup communication [0xF0])5.2.2 读取值(Read Var [0x04])5.2.2.1 当PDU为JOB时5…

redis之分片集群

0. 前言 在海量的数据面前,单个 redis 实例的能力是有限的,无可能无限增大的内存,所以必须要构建分片集群,来横向拓展来支持保存更多的数据。 1. 分片集群是什么? 分片集群主要是将 redis 的数据划分成多份&#xf…

BHG Mall 聚焦消费者需求,“超级宠粉节”缔造营销新高度

“如何读懂消费者?”处在行业关键转型期的购物中心,面临着这一待解的难题。 有哪些业态、品牌、商品让消费者着迷又上瘾?购物中心需要培养和消费者之间的默契,购物中心不仅要引领消费趋势、满足消费需求,还要深度融入…

Java+SSM宠物销售网站(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用的技术实现如下: 后台框架:Spring、SpringMVC、MyBatis UI界面:JSP、jQuery 数据库:MySQL 该系统主要分为前台和后台两大功能模块,共包含两个角色:用户、管理员。 具体的系统功能如…

高分子PEG:DBCO-PEG-OPSS,OPSS-PEG-DBCO,二苯并环辛烯PEG邻吡啶二硫

【产品描述】 DBCO-PEG-OPSS中DBCO试剂可以自动标记叠氮化物修饰的生物分子,而不需要使用有毒的铜催化剂。聚乙二醇化可以提高多肽和蛋白质的溶解性和稳定性,降低其免疫原性。它还可以抑制带电分子与修饰表面的非特定结合。西安凯新生物科技有限公司点击…

html5:notification(浏览器通知)

一、notification简介 Web Notifications是HTML5 的一个特性,目前我知道的有谷歌浏览器和windows edge对它进行了支持,用于向用户配置和显示桌面通知。 二、notification方法 2.1静态方法 这些方法仅在 Notification 对象中有效。 Notification.requ…

5 种有效的电子邮件营销技巧可增加您的转化率

关键词:电子邮件营销、转化率 电子邮件营销是一种非常常见的策略,可以将客户吸引到您的网站并增加转化率。 由于如此普遍,消费者平均每天会收到 78 封新电子邮件。您的电子邮件周围充满了噪音。 那么,您可以做些什么来让您的电子邮…

架构师必读 —— 逻辑模型(10)

以零基础思考摆脱障碍 我们已养成了惰性思考及在其延伸下不断堆叠的思考习惯。 因为以往的方式未出现过重大错误,所以总以为会万无一失。 但是,如果用堆叠式思考方式继续沿用上一年度的做法的话,不管过多少年也很难破旧立新。有时我们有必要重…

第3章 管理端(Vue)布局面的设计实现

1 导入“element-plus:Icon”组件 1.1“element-plus:Icon” 组件导入命令: npm install element-plus/icons-vue 1.2“element-plus:Icon” 组件配置: import { createApp } from vue//在vue-cli4(4.5.…

关于A2B与DSP/DAC传输音频的时钟问题

加我V hezkz17 进同行数字音频系统设计开发交流答疑群 1 AD2428----->某功放DSP 是通过IN3输入音频数据 为什么 BCLK 和LRCLK 没有连接TDM时钟 ? 2 新改的板子 用IN1作为音频数据输入 IN1和 OUTPUT3 都是使用 A2B的TDM时钟 因为OUTPUT3 是上行TDM8 用作回传音和录音的…

用好这个任务管理工具,轻松躲避职场明枪暗箭

俗话说:“职场如战场”,而战场上,就不可避免地存在着形形色色的人,以及竞争与对立关系。升职、加薪、都是足以让人心动的诱惑,有利益存在的地方,就有勾心斗角,明坑暗亏。 正所谓,明…

简述 MySQL 的字符集和比较规则(简洁明了)

字符集和比较规则 字符集的概念: 人们抽象出一个字符集的概念来描述某个字符范围的编码规则。 比较规则的概念: 对于某一种字符集来说,可以制定用来比较字符大小的多种规则,也就是说同一种字符集可以有多种规则。 最常用的 U…

阿根廷夺冠!梅西圆梦!历届世界杯还有哪些数据看点?

从1930年到2022年,世界杯已走过92年的光辉岁月,从马拉多纳的“上帝之手”、贝利的“四两拨千斤”、罗纳尔迪尼奥的“诡异吊射”、范佩西的“鱼跃冲顶”再到姆巴佩上演“帽子戏法”刷新记录,世界杯为球迷朋友们带来了无数个惊心动魄的精彩瞬间…

链表(1)-------数据结构

链表(重点): 链表是物理存储结构上面非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 1)在顺序表中,我们不光引入了一段连续的内存,还引入了一块连续的内存空间,叫做usedsize,来表示对应数组中…

Opencv(C++)笔记--Canny边缘检测算法

目录 1--算法原理 2--Opencv API 3--代码实例 1--算法原理 具体原理讲解可参考博客1 和 博客2,算法主要步骤如下: ① 使用高斯模糊(高斯滤波)去除噪声; ② 进行灰度转换,转换为灰度图; ③ 计…

数据结构---动态规划

动态规划爬楼梯问题解法1第一步第二步第三步JAVA实现解法2问题建模最优子结构边界状态转移公式求解问题递归JAVA实现备忘录算法JAVA实现解法三JAVA实现(斐波那契数列)国王和金矿一个错误的解法排列组合解法JAVA实现动态规划爬楼梯问题 有一座高度是10级…

rk3568 添加gc2053摄像头驱动

在设备树文件代码中添加 gc2053 设备节点 &i2c2 {status "okay";pinctrl-0 <&i2c2m1_xfer>;/* split mode: lane0/1 */gc2053: gc205337 {status "okay";compatible "galaxycore,gc2053";// 需要与驱动中的匹配字符串一致reg …

高级篇-rabbitmq的高级特性

1.消息可靠性 三种丢失的情形&#xff1a; 1.1 生产者确认机制 启动MQ 创建Queues&#xff1a; 两种Callback: 1.ReturnCallback:全局callback 2.ComfirmCallback: 发送信息时候设置 Testpublic void testSendMessage2SimpleQueue() throws InterruptedException {// 1.…

第八章练习题-3

目录 第十三题 题目 Student类 Teacher类 main类 老师的代码 Student类 Teacher类 main类 第七问&#xff1a;定义多态数组 main类 运行结果 问题 原因 解决办法 老师代码&#xff1a;main类 结果 第八问 运行结果 第十四题 第十五题 题目 方法的多态…

HFSS使用经验三

目录 一、如何量取HFSS某一点的空间位置 二、如何快速的切换视图 三、HFSS中绘制圆柱体 四、如何修改HFSS的仿真线程数量 五、HFSS中如何选取挖空的面 六、HFSS中如何实现参数扫描 一、如何量取HFSS某一点的空间位置 右击可以点击Measure按键 鼠标放到特殊点&#xff0c…