为什么多个线程不可能同时抢到一把锁_HFL Redis_12_redis分布式锁的3种实现方式...

HotFrameLearning(简称 HFL) Redis_12_redis分布式锁的3种实现方式

-

一、大致介绍

```

1、昨天介绍完redis的数据结构后,有小伙伴让本人讲讲redis的分布式锁,因此才有了此篇的由来,只是把我的节奏提前了而已;

2、接下来我就通过几种方式介绍一下分布式锁的使用;

```

二、源码分享

2.1 获取redis锁且快速失败

af87122d39e37f31ed01cbc84c4f8ee4.png

图1 - 获取redis锁且快速失败

```

1、图1中,我们首先区分的是单机模式还是集群模式;

2、通过简单的 set 操作,但是要注意一点,set 时需要设置 expiryTimeMills 超时时间,而且设置key与设置expiryTimeMills需要是在一条原子语句里面,如果不是的话则会引起不必要的死锁问题;

3、至于为什么会引起死锁,假设 set key 与 set expiryTimeMills 是两条代码语句,当 set key 成功后,程序立马宕机了,那么这个 key 就没有失效时间,相当于永久有效,那么下次再次竞争获取该 key 时就永远都是失败的,因此要特别注意key与expiryTimeMills需要在同一条原子语句里面被执行;

4、当时又有人说,尝试一次就失败了,岂不是太不让调用方省心了,调用方想尝试多次还得自己写个代码玩玩,因此就有了下面尝试多次获取锁的操作;

```

2.2 尝试数次获取锁,获取不到则返回失败

1f61455efec665a9cac369060aca9dde.png

图2 - 尝试数次获取锁,获取不到则返回失败

```

1、图2中,同样我们首先区分的是单机模式还是集群模式;

2、通过在 tryLockFailFast 外面再套一层 while 循环处理,让入参多传入尝试次数retryTimes、尝试间隔时间retryIntervalMills 两个字段,即可满足多次尝试获取锁的诉求,这样调用方就能省心了;

3、虽然加锁是完事了,但是解锁呢,是不是直接删掉就完事了呢?请接着看~

```

2.3 释放redis锁且快速失败

25ecac233d407636132a6bc91a8aad71.png

图3 - 释放redis锁且快速失败

```

1、图3中,同样我们首先区分的是单机模式还是集群模式;

2、只是在解锁的时候,有点点不同,我们需要先看看我们解锁的key对应的内存值是不是我们当初加锁的那个入参值?

3、为什么要这么判断呢?原因就是假设A线程加锁了,但是A的任务还没有执行完,此时key超时过期了,然后B线程又成功抢到了该锁,但是当B前脚抢到锁后A后脚就执行完了任务准备释放锁,那么就会将B已经获取到的锁释放掉,这么一操作已不是把不该释放的释放了,最终都会导致相应业务功能执行出问题的;

4、因此才会在解锁的时候,看下锁对应的值是不是当初加锁的那个值,如果一致则删除,否则删除失败;

5、但是这么一连串的 get del 是两个命令语句,但是解锁的真实诉求需要保证原子性,因此我们就需要 redis 给我们提供的 lua 脚本原子性执行多个命令语句;

6、但是但是,说到这,又会有小伙伴会问,怕担心任务执行太久导致redis超时,有啥好的方式处理呢?接着看~

```

2.4 阻塞获取redisson锁

2ccf1350dab95ea91423565ccabf563b.png

图4 - 阻塞获取redisson锁

```

1、图4中,用的redisson框架版本号为 redisson-3.11.2.jar,具体maven坐标大家去中央仓库看吧;

2、大家会想,这个redisson和之前的 tryUnLockFailFast 的加锁有啥区别呢?不也是执行加锁么?

3、答案当然不一样,redisson 底层会有一个续命线程,每到过期时间的的1/3时就自动重新将过期时间置为入参的过期时间值,所以即使业务线程的任务执行很久,也不会因为锁自动过期一事而烦恼,岂不快哉;

```

2.5 redisson知识扩展

8890178bdb96f069ae76ec7c51f29b91.png

图5 - redisson知识扩展

```

1、图5中,我们稍微多看一眼 redisson 框架,然后我们会发现底层提供了很多的锁操作;

2、然而稍微再认真的同学仔细看看,会发现我们 JUC 有的类,这里都差不多实现了一番,可见 redisson 为分布式做了很多封装,方便调用方尽情的使用;

```

欢迎关注+点赞,您的肯定是对我最大的支持!!!

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

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

相关文章

linux下mysql5.7修改密码

开始修改MySQL用户密码 ① 输入use mysql回车; ② 输入update user set password password(“147258”)where user’root’; “147258”为你自己设置的密码; 执行第二步后如果报错: 执行后报错  ERROR 1…

react项目中的参数解构_重构复杂的React组件:编写高效且可读组件的5个最佳实践...

随着 React.js 的不断进化,现在的它已经成为 Web 组件中最受欢迎的视图库之一。但是你手中的它,是否真的能够正常工作呢?本文将主要描述 5 个关于React 组件的最佳实践,希望对正在关注 React 组件的你有所帮助。我自己是一名从事了…

robotFramework-ride使用1-关键字驱动与数据类型

RF项目结构 项目文件夹(new project) 用例集(test suit) 测试用例(test case) RF基本功能-设置区介绍 项目 --》settings----》Document:添加用例说明 suit setup:执行此测试套件…

opencv threshold_基于深度学习OpenCV与python进行字符识别

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达当我们在处理图像数据集时,总是会想有没有什么办法以简单的文本格式检索图像中的这些字符呢?今天我们就一起看看有没有什么简单的办法可以实现这一…

python3 robotframework+pycharm框架搭建

1.安装python3 框架组成:自动化基础库(robotframework)图形界面(robotframework-ride) 2.安装RF框架 安装robotframework。pip install robotframework -i https://pypi.doubanio.com/simple 安装robotframework-r…

delphi if多个条件_判断(if)语句

判断(if)语句目标开发中的应用场景if 语句体验if 语句进阶综合应用01. 开发中的应用场景生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?……程序中的判断if 今天发工资: ​…

excel sheet限制_Python 处理Excel内的数据(案例介绍*3)

点击上方“蓝字”关注我们了解更多精彩案例一介绍现在有一批电商产品跟当日销量的数据,如下,总共有上万笔的数据,现在需要统计每个品牌当日的销售量,比如美宝莲今天总共卖出了多少的商品,另外需要统计每个品牌下面的每…

robotFramework-ride使用2-分支与循环

1条件运算 Run keyword if 如果条件为True,则执行关键字 ELSE IF ELSE IF使用案例1: 2循环 在使用append to list前,添加Collections库 列表元素添加与删除 列表元素求和-循环 :FOR ${i} IN 1 2 3 4 5 :FOR ${i} IN RANGE 1 5FOR里面…

项目案例:在线拍卖系统_冀拓公司在张家口开展尾矿库在线监测监控系统 建设项目...

近日,受张家口弘锦矿业有限责任公司委托,冀拓公司在弘锦矿业大东沟尾矿库开展了安全风险智能在线监测监控系统施工安装服务。由于该库为“头顶库”,按照省应急管理厅要求“头顶库”必须在6月底之前完成联网,在6月24日接到项目任务…

Linux 两台服务器之间传输文件和文件夹

今天处理一个项目要迁移的问题,突然发现这么多图片怎么移过去,可能第一时间想到的是先从这台服务器下载下来,然后再上传到另外一台服务器上面去,这个方法确实是可行,但是实在是太费时间了,今天我就教大家怎…

arm汇编指令集_1. 从0开始学ARM安装Keil MDK uVision集成开发环境

关于ARM的一些基本概念,大家可以参考我之前的文章:《0.到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】》0. 如何学习arm?ARM的知识点很多很杂,很多同学都遇到过类似的问题&#xff0…

32位存储环境下整数范围为什么是[-2^31,2^31-1]?

一、概念:存储单位 1.“位”是数据存储的最小单位。在计算机中的二进制数系统中,位,简记为bit,也称为比特,每个0或1就是一个位。 2.“字节”是计算机信息技术用于计量存储容量的一种计量单位,通常情况下,…

mysql5.7配置用户名密码_MySQL57安装图解

原文:MySQL57安装图解_ma524654165的博客-CSDN博客作者: ma524654165MySQL57安装图解、、、0-需要准备的安装包1在百度下载MySQl开始安装下载的MySQL勾选同意点击Next4选择Server only5点击execute继续6点击next7直接next8配置服务器的端口-默认9设置一个…

vc6.0添加注释快捷键

第一步:工具 第二步:点击定制(Customize)-键盘-All commands-选择CommentOut,在新建快捷键处填写Ctrl/。

python 释放内存_学了4年C++后,我转向了Python

作者 | asya f 编译 | Lisa C 已经学不动了,现在换 Python 还来得及吗?一位四年工作经验的 C 程序员亲述转型历程,这不仅仅是语言上的转变,而是代码思维甚至工作环境的转变。 通常,程序员会认为 Python 编码比较简单&a…

2021-03-07

一、安装和使用Anaconda 1、anaconda是什么? Anaconda在英文中是“巨蟒”的意思,与python的意思相近,它是python的包管理器和环境管理器。 2、为什么需要安装anaconda? 原因有以下几点: 附带一大批常用的数据科学…

python如何实现模拟登录_超详细的Python实现新浪微博模拟登陆(小白都能懂)

最近由于需要一直在研究微博的爬虫,第一步便是模拟登陆,从开始摸索到走通模拟登陆这条路其实还是挺艰难的,需要一定的经验,为了让朋友们以后少走点弯路,这里我把我的分析过程和代码都附上来。 首先,我们先用…

wacom mac驱动_MAC系统装Wacom手绘板的方法及注意事项

⚠️注意事项⚠️:一般Wacom官网的驱动会比苹果最新系统更新慢很多,所以如果你是最新系统,那官网的驱动你目前肯定用不了!要找客服去单独要。电话:4008105460 如果你刚好是老系统,那么恭喜你~?…

linux mplayer_移植mplayer播放器到EK200开发板的步骤浅析

mplayer是一款开源多媒体播放器,以gnu通用公共许可证发布此款软件可在各主流操作系统使用,一方面它资源占用率低;另一方面,无论是音频还是视频方面,它支持的格式相当全面,能支持播放大部分的音频、视频格式…

printf格式字符串和输出列表个数及类型不匹配案例

printf函数不会进行任何类型转换(包括隐式转换),它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式) void main() {int i10.0/3;float j10.0/3;printf("%d\n",i); //3printf…