redis面试(二十二)读锁释放

假设现在已经有各种锁的重入什么的,那如何释放锁?

读锁+读锁

假如说,同一个线程多次加读锁,或者不同的线程加了多个读锁
当前的锁结构长这样
anyLock: {
“mode”: “read”,
“UUID_01:threadId_01”: 2,
“UUID_02:threadId_02”: 1
}
{anyLock}:UUID_01:threadId_01:rwlock_timeout:1 1
{anyLock}:UUID_01:threadId_01:rwlock_timeout:2 1
{anyLock}:UUID_02:threadId_02:rwlock_timeout:1 1

写锁+读锁

或者是同一个线程先加了写锁,后加了读锁,我们看是如果单独释放读锁的
anyLock: {
“mode”: “write”,
“UUID_01:threadId_01:write”: 1,
“UUID_01:threadId_01”: 1
}

{anyLock}:UUID_01:threadId_01:rwlock_timeout:1 1

针对这些情况,如何释放读锁,代码如下
RedissonReadLock.unlockInnerAsync();
在这里插入图片描述
在这里插入图片描述

我们来分析一下,假如说客户端A线程1来释放读锁
先看参数
KEYS[1] = anyLock
KEYS[2] = redisson_rwlock:{anyLock}
KEYS[3] = {anyLock}:UUID_01:threadId_01:rwlock_timeout
KEYS[4] = {anyLock}

ARGV[1] = 0
ARGV[2] = UUID_01:threadId_01

前两行

local mode = redis.call(‘hget’, KEYS[1], ‘mode’);
if (mode == false) then

判断这个key存在不存在,现在已经加了锁,肯定是存在的

再往下

local lockExists = redis.call(‘hexists’, KEYS[1], ARGV[2]);

判断anyLock这个hash表中UUID_01:threadId_01 这个key是否存在,存在的话返回对应的值
现在也肯定是存在的,所以会返回出来一个值

hincrby增量更新,但是后面是-1,所以是原本的值 -1,并且返回更新后的值

local counter = redis.call(‘hincrby’, KEYS[1], ARGV[2], -1);

这两行命令要注意一下,什么情况下值会不等于0?
如果同一个线程多次加了读锁的情况下,那要释放多次,这里只-1,所以肯定是大于0 的,
如果=0的话,就要删除anyLock这个hash表中UUID_01:threadId_01这个key
这里就是读锁+读锁可重入的释放

if (counter == 0) then
redis.call(‘hdel’, KEYS[1], ARGV[2]);

这一行,要删除一个普通的键值对,

redis.call(‘del’, KEYS[3] … ‘:’ … (counter+1));

KEYS[3] = {anyLock}:UUID_01:threadId_01:rwlock_timeout
后面为什么是 (counter+1) 因为刚才不是-1了吗,这里要删除的是原本的值
那拼接后就是{anyLock}:UUID_01:threadId_01:rwlock_timeout:1
这里要删除这个普通键值对,看最上面我们假设的数据结构,确实有这个
如果删除的是重入后的第二次释放
那拼接后就是{anyLock}:UUID_01:threadId_01:rwlock_timeout:2
也是符合重入几次就释放几次的逻辑。

继续往下,这个是判断anyLock这个hash表中的键值对数量,还大于1个吗

if (redis.call(‘hlen’, KEYS[1]) > 1) then

默认是有一个mode的key,每有一个线程加锁,就会新建一个UUID_XX:threadId_XX这种key,那如果有多个读锁的话,现在只释放了一个,key的数量肯定是大于1的

进入if判断里面
定义一个-3的值,后面再说具体什么作用
local maxRemainTime = -3;

取出来anyLock这个hash表中的所有key
local keys = redis.call(‘hkeys’, KEYS[1]);

进入循环for n, key in ipairs(keys) do ,循环取出所有的key

根据hash表中每个key取出来所有的值
counter = tonumber(redis.call(‘hget’, KEYS[1], key));

判断这些值是否是数字,如果是数字的话进入下面的逻辑
if type(counter) == ‘number’ then

如果这个值是多个的话,要从最大开始循环
for i=counter, 1, -1 do

这里是获取过期以毫秒为单位的时间的
local remainTime = redis.call(‘pttl’, KEYS[4] … ‘:’ … key … ‘:rwlock_timeout:’ … i);
maxRemainTime = math.max(remainTime, maxRemainTime);

KEYS[4]={anyLock}
key = UUID_01:threadId_01 /UUID_02:threadId_02 就是所有的key
那最终拼出来的就是
{anyLock}:UUID_01:threadId_01::rwlock_timeout:2
{anyLock}:UUID_02:threadId_02::rwlock_timeout:1
那这里是通过hash表中还存在的读锁,遍历对应的普通键值对锁,来获取他们的最大过期时间

if maxRemainTime > 0 then
redis.call(‘pexpire’, KEYS[1], maxRemainTime);

这个判断是为了延长anyLock这个hash表的过期时间,和对应普通键值锁的过期时间,防止提前过期

if mode == ‘write’ then
return 0

这个是为了应对,先加了写锁,再加读锁的情况。现在读锁已经释放了,写锁不能在这里处理。所以这个逻辑就是判断,如果是写锁的话,要直接返回。

redis.call(‘del’, KEYS[1]);
redis.call(‘publish’, KEYS[2], ARGV[1]);

如果读锁还有其他线程,或者是重入的锁还没释放完,不会走到这里的。都在前面的判断已经拦截了
也就是说,只要能走到这里的都是读锁中所有的线程都释放完毕了,那就要删除这个anyLock的hash锁了。 并且将这个消息进行广播。

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

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

相关文章

去雾去雨算法

简单版 import cv2 import numpy as npdef dehaze(image):"""简单去雾算法,使用直方图均衡化来增强图像"""# 将图像转换为YUV颜色空间yuv_image cv2.cvtColor(image, cv2.COLOR_BGR2YUV)# 对Y通道(亮度)进行…

数据结构——队的基本操作

一、顺序队 队的用法:先进先出 跟平时我们遇到的大多情况一样,队的主要思想就是先进先出,比如我去食堂打饭,我先排那么就是我先打到饭咯 顺序队:其实说白了就是一块空间用两个指针去指向,为了实现先进先…

C语言指针重学

学习要纲:建议掌握 gdb调试(b ,d ,fin ,bt ,print ,awatch ,up ,down ,set pretty等) SourceInsight软件看代码(全局搜索 文件搜索等) git如何调取分支合并(git branch,git blame,git log,git pull,git reset --hard等) 等内容,下面是对于指针的一个重新学习. C语言的指针&…

AI工具 GPT 学术优化 (GPT Academic) 安装实践

GPT 学术优化 (GPT Academic)是一个综合的AI GPT工具包,可以完成各种gpt辅助的工作,比如代码解读、翻译、读论文等功能。官网:GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口,特别优化论文阅读…

2024年中国运筹学会运筹竞赛(数据驱动赛道)报名通知

竞赛组织 主办单位:中国运筹学会(国家一级学会) 承办单位:中国科学技术大学 支持单位:杉数科技、海康威视、中国科学技术大学管理学院、《运筹学学报》杂志 竞赛内容 本次竞赛(本科生组)由竞…

BOSS直聘财报:2024年第二季度净利润4.17亿元,同比上涨34.8%

8月28日美股盘前,BOSS直聘(NASDAQ:BZ,HK:2076)发布了2024年第二季度财报。在第二季度,公司经营效率不断提升,非通用会计准则下,取得净利润4.17亿元,同比上涨34.8%。 第二季度,公司持…

实习结束总结20240828

长达两个月的实习终于在今天结束了,不知怎的,心如止水,没有高兴,没有伤心,毫无波澜的内心甚至让自己都感觉可怕,也许,这就是成长吧。 硬件上: 1.cadence需要继续深入学习&#xff…

深圳保障房、商品房、小产权房子类型对比

摘要: 整理了我认知以内的深圳房子类型,有安居房,可售人才房,共有产权房、配售型保障房、商品房、统建楼、农民房的区别。如果数据存疑,可以多方对比论证,我也主要靠百度。 我发现我很多同事是非深户&#…

JS WebSocket 深度解析

JS WebSocket 深度解析 文章目录 JavaScript WebSocket 深度解析一、WebSocket 是什么二、JS 中如何使用 WebSocket1. 创建 WebSocket 对象2. 连接打开事件3. 监听消息事件4. 监听错误事件5. 关闭连接 三、WebSocket 包含哪些属性或方法 API1. 属性2. 方法 四、扩展与高级技巧1…

结果一。5.be doing表将来和 表 will的区别

be doing 表⽰近期、眼下就要发⽣的事情; will 表⽰将来的时间,则较远⼀些。如: He is going to write a letter tonight.He will write a book 。 be going to 表⽰根据主观判断将来肯定发⽣的事情。 will+ 动词原形表⽰⼀般将来时。 will ࿰

【xilinx】米联客ZYNQ MZ7100自学发现JTAG烧写失败

3-2-01米联客 2022 版 ZYNQ SOC SDK 入门篇 02 程序固化入门(SDK 方式) 生成了boot.bin 2.4.2 程序通过jtag烧不进去卡在performing erase operation 最终发现是spi的flash type 模式设置错误,文档和板卡没对应上 文档写的qspi-x4-single 实际用的qspi-x8-dual_par…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在当今这个视觉为王的时代,16:9横屏视频凭借其宽阔的画面和卓越的观看体验,已经成为许多视频创作者和营销专家的首选格式。如果你想制作出引人注目的横屏视频,选择高质量的视频素材库是关键。无论你是视频制作的老手还是刚入行的新手&#xf…

免费分享一套SpringBoot+Vue个人理财管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue个人理财管理系统,分享下哈。 项目视频演示 【免费】SpringbootVue个人理财管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入而广泛的应用&am…

【图像去噪】论文复现:代替ReLU!Pytorch实现即插即用激活函数模块xUnit,并插入到DnCNN中实现xDnCNN!

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中…

文章生成用这三款伪原创软件效果好

在当今信息爆炸的时代,无论是网站运营者、博主、作家还是学生,对文章的需求量越来越大。他们需要用大理的的原创文章来满足他们工作需求。然而,对于许多人来说,写作一篇优质的文章并非易事。这就产生了一种需求,那就是…

3 Python开发工具:VSCode+插件

本文是 Python 系列教程第 3 篇,完整系列请查看 Python 专栏。 Visual Studio Code的安装非常简单,就不放这里增加文章篇幅了。 相比PyCharm,VSCode更加轻量,启动速度快。并且搭配Python插件就能实现和Pycharm一样的代码提示、高…

如何将平淡无奇的产品推向市场?借助ChatGPT,仅需3秒即可化身短视频创意策划大师,助你的产品一夜成名!

毫无趣味的产品要如何宣传?用ChatGPT,3秒钟成为创意短视频策划高手,让你的产品出圈!© 由 ZAKER 提供 最近,全红婵最爱的小乌龟火了。 制作小乌龟的某位义乌商家在接受采访时,表示自己有了甜蜜的烦恼…

力扣刷题(2)

寻找两个正序数组的中位数 寻找两个正序数组的中位数-力扣 思路: 合并两个正序数组找中位数 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int arr[nums1Size nums2Size];int n1 0, n2 0;int m 0;int q;//合并两个正序数组w…

Git 远程操作

1. 理解分布式版本控制系统 我们所说的⼯作区,暂存区,版本库等,都是在本地!也就是在笔记本或计算机上。⽽我们的 Git 其实是分布式版本控制系统.可以简单理解为,我们每个⼈的电脑上都是⼀个完整的版本库,这…

Java 中的抽象工厂模式:优雅地掌握对象创建

文章目录 一、概述三、抽象工厂设计模式的意图四、抽象工厂模式的详细解释及实际示例五、Java 中抽象工厂模式的编程示例六、抽象工厂模式类图七、Java 中何时使用抽象工厂模式八、抽象工厂模式 Java 教程九、抽象工厂模式的优点和权衡十、Java 中抽象工厂模式的实际应用十一、…