redis第四章-redis下redisson分布式锁原理和源码分析

news2024/12/23 14:40:51

1.如图,
如上图,在最简单使用分布式锁的时候,我们一般获取一个锁对象,对这个对象进行加锁,当执行完业务流程代码后,对分布式锁进行解锁,这样就保证了高并发下程序的锁安全,以及原子性。

请添加图片描述
如图,当线程1获得锁之后,会执行业务流程代码,将锁的持有时间设置为30秒,同时每隔10秒检查是否还持有锁,如果业务流程代码没有执行完,就会延长持有锁时间再到30秒,直到执行完成释放锁
此时线程2没有获得锁,会进入一个while循环,间歇性尝试加锁,同时也会订阅线程1是否执行完,因为线程1在释放锁后,会发布一个消息

(1)先看redissonLock.lock();这个加锁代码
在这里插入图片描述
点击lockInterruptibly();方法
在这里插入图片描述

点击lockInterruptibly方法,此时注意这里时间传了-1在这里插入图片描述
点击这个方法,时间传入的是上面的-1
在这里插入图片描述
点到最里面,可以看到因为传入的是-1,不会走第一个判断,直接走我标红色的方法
在这里插入图片描述
点进去可以看到一段lua脚本,这个lua脚本可以分为三块,每一块以end结束,最后一块没有end,第一块代表获取到分布式锁,第二块代表可重入锁(用的很少,本章不提),第三块代表没有获取到分布式锁
在这里插入图片描述
详细解释:
因为传入的KEYS[1]代表的是传入的锁key,ARGV[1]代表的是时间,看下图,可以看到默认的是30秒,ARGV[2]代表的是线程id+唯一标识uuid组合,方便删除锁使用的
在这里插入图片描述
在这里插入图片描述
所以第一块就是设置一个分布式锁名,同时设置过期时间,以及分布式锁名对应的value,这个设置是方便判断删除锁使用的

当获取到对应锁之后,得到一个future方法,开启一个监听器,监听是否还持有锁,实际就是看门狗的机制
在这里插入图片描述
在这里插入图片描述

(2)再看获取失败锁的代码,即没有获得本次分布式锁
在这里插入图片描述
可以看到当失败的时候,会返回一个pttl的key,同时也会返回剩余时间,即线程1获得的默认时间30s减去已经执行的时候,假如已经执行的时间是5s,那么此次返回的就剩下25s的时间了
在这里插入图片描述
此时方法会返回到这,ttl的这个返回值就是25,他会继续尝试加一次锁,如果还是加锁失败,就会执行 if (ttl >= 0) {},这个用了juc的信号量,简单理解就是会在这里等待25s,这25s是等待状态,不会占用cpu,当25s过后,就会再次执行while循环
同时,这样的话,就会出现一个问题,在25s内如果线程1已经执行完了呢,难道这个线程2还要等25s后再重新获得锁吗?当然不会啦
在这里插入图片描述
如上图,这里有个订阅模式,实际是redis的特性,他会订阅一个频道,频道的名字是锁的名字
在这里插入图片描述
看下解锁逻辑,解锁的时候,就会给这个频道发送消息,这样上面就会监听到解锁,也能够继续尝试获取锁了
在这里插入图片描述
如上图,当锁过期了之后,就会发布一个订阅消息,要求解锁了
上面第一块代表过期了,就发布
第二块代表不是我锁的,就不能我解锁
第三块判断,必然走到else里,也会发送订阅消息,因为ARGV[3]传的是-1,

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

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

相关文章

Linux 实验三 Linux C开发工具的使用

做实验之前必须会vim的简单使用 会使用vi 进入文件 i 插入 esc进入底行模式 :wq退出 1、vi编辑器和gcc编译器的简单使用 (1)在用户主目录下新建一个目必须掌握录,命名为vifile (2)进入目录vifile (3&…

LearnOpenGL-高级OpenGL-10.实例化

本人初学者,文中定有代码、术语等错误,欢迎指正 文章目录 实例化例子1.1:100个2D四边形使用Uniform 实例化数组例子1.2:100个2D四边形使用实例化数组例子2.1:行星带不使用实例化数组例子2.2:行星带使用实例…

【转码】nohup后台执行ffmpeg转码后推流srs

【ffmpeg】flv1转码h264且降低分辨率 【ffmpeg】filter_complex 转码视频保留音频推直播flv流 拉流播放剪辑到2M mp4 转flv 同时转码,拉流地址:http://1.1.1.5:8078/live/streamLow.flv 过了三个月,忘了。通过查询后台程序,判断当时自己是用的哪个脚本:看下上次操作的时间…

MySQL简单教程

MySQL的数据类型 类型用途int整型,相当于java的intbigint整型,相当于java的longfloat浮点型double浮点型datetime日期类型timestamp日期类型(可存储时间戳)char定长字符varchar不定长字符text大文本,用于存储很长的…

皮卡丘xss之盲打、xss之过滤

1.xss之盲打 我们先按照题目输入 提交后&#xff0c;很平常 再试试插入payload&#xff1a;<script>alert(1)</script>和<script>alert(2)</script> 提交后还是不变 此时我们看提示 我们尝试访问该地址&#xff1a;127.0.0.1/pk/vul/xss/xssblind/ad…

聊聊Scrum价值观与测试启发

这是鼎叔的第六十二篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。 敏捷理论博大精深&#xff0c;相关实践方法论和工具层出不穷&#xff0c;各大公司都有特…

从零开始学习JVM(六)-直接内存和执行引擎

1 直接内存介绍 直接内存不是虚拟机运行时数据区的一部分&#xff0c;也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存空间。直接内存来源于NIO&#xff0c;通过存在堆中的DirectByteBuffer操作Native内存。通常访问直接内存的速度会…

Stable Diffusion教程

什么是Stable Diffusion Stable Diffusion是一种潜在扩散模型&#xff08;Latent Diffusion Model&#xff09;&#xff0c;能够从文本描述中生成详细的图像。它还可以用于图像修复、图像绘制、文本到图像和图像到图像等任务。简单地说&#xff0c;我们只要给出想要的图片的文…

RK3588平台开发系列讲解(网络篇)本地套接字

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、本地套接字是什么二、本地字节流套接字 服务器三、本地字节流套接字 客户端沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本地套接字是 IPC,也就是本地进程间通信的一种实现方式。除了本地套接字以外,…

皮卡丘Unsafe Filedownload

1.不安全的文件下载概述 文件下载功能在很多web系统上都会出现&#xff0c;一般我们当点击下载链接&#xff0c;便会向后台发送一个下载请求&#xff0c;一般这个请求会包含一个需要下载的文件名称&#xff0c;后台在收到请求后 会开始执行下载代码&#xff0c;将该文件名对应…

旧改快讯--桑泰南山桃源“工改商住”项目规划修改

南山区桃源街道西丽同富裕工业城城市更新单元原列入《2019年深圳市南山区城市更新单元计划第一批计划》&#xff0c;后进行更新方向调整&#xff0c;列入《2020年深圳市南山区城市更新单元计划第三批计划》&#xff0c;2022年8月发布实施主体公示&#xff0c;实施主体为深圳市桑…

chatgpt赋能python:Python到底是一个SEO友好的选择吗?

Python到底是一个SEO友好的选择吗&#xff1f; 随着Python成为越来越受欢迎的编程语言&#xff0c;人们开始担心它是否适用于SEO。因为SEO是一项关键性能指标&#xff0c;因此希望了解Python是否确实是适用于这一目标。 Python的SEO优缺点 首先&#xff0c;Python确实具有一…

shell编程之循环语句与函数

文章目录 一.shell函数1.作用2.使用函数的优势3.shell函数定义3.1方式1&#xff1a;3.2方式2&#xff1a; 4.调用函数的方法5.函数返回值5.1 return5.2 exit 6.1-100奇偶求和相加 二.函数传参1.含义2.函数传参的方式 三.函数变量的作用范围1.函数变量的作用范围2.调用函数2.1示…

什么蓝牙耳机戴着舒服,介绍几款佩戴舒适的骨传导蓝牙耳机

骨传导耳机是一种新式的耳机&#xff0c;与常规听歌的入耳式耳机相比&#xff0c;不需要将耳机塞住的耳道&#xff0c;在长时间佩戴时不会损伤听觉。能听声音不需要入耳&#xff0c;在户外运动时能及时听到环境音&#xff0c;避免安全隐患。现在市场上有骨传导。以下是一些骨传…

解决message(antd-design组件库)弹窗多次数出现的问题

当我们多次点击按钮的时候&#xff0c;会出现下图这样的情况&#xff1a; 网址&#xff1a; 全局提示 Message - Ant Design 这样看起来&#xff0c;会降低用户的体验。所以&#xff0c;我想要的效果是&#xff0c;点一次出现一次&#xff0c;当我再次点击的时候&#xff0c;会…

二叉搜索树桶排序

1、二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树 *若它的左子树不为空则左子树上所有的节点的值都小于根节点的值 *若它的右子树不为空则右子树上所有的节点的值都大于根节点的值 *它的左右子树也分别是一棵二叉搜索树 *二…

皮卡丘CSRF

1.CSRF&#xff08;get&#xff09; 首先看提示&#xff0c;我们选择用户kobe&#xff0c;密码123456登录 点击修改个人信息&#xff0c;假如用户要把住址改为shanxi 再点击submit&#xff0c;同时用bp抓包&#xff0c;我们可以看到是get请求&#xff0c;数据包含在URL之中 将…

web服务器有哪些

<1>什么是web服务器 “网络服务”&#xff08;Web Service&#xff09;的本质&#xff0c;就是通过网络调用其他网站的资源。 Web Service架构和云 如果一个软件的主要部分采用了”网络服务”&#xff0c;即它把存储或计算环节”外包”给其他网站了&#xff0c;那么我…

【Linux网络编程】HTTPS协议原理

https协议原理 一、HTTPS是什么二、基本概念2.1、什么是加密2.2、为什么要加密 三、常见的加密方式四、数据摘要(指纹)&&数字签名五、HTTPS的工作过程探究方案&#xff08;1&#xff09;&#xff1a;只使用对称加密方案&#xff08;2&#xff09;&#xff1a;只使用非对…

论文笔记--PANGU-α

论文笔记--PANGU-α: LARGE-SCALE AUTOREGRESSIVE PRETRAINED CHINESE LANGUAGE MODELS WITH AUTO-PARALLEL COMPUTATION 1. 文章简介2. 文章概括3 文章重点技术3.1 Transformer架构3.2 数据集3.2.1 数据清洗和过滤3.2.2 数据去重3.2.3 数据质量评估 4. 文章亮点5. 原文传送门6…