redis面试(二十三)写锁释放

先加了写锁,后面再次加写锁或者读锁

anyLock: {
“mode”: “write”,
“UUID_01:threadId_01:write”: 2,
“UUID_01:threadId_01”: 1
}

写锁的释放lua脚本在这里
RedissonWriteLock.unlockInnerAsync()
在这里插入图片描述

比如说现在的参数是这
KEYS[1] = anyLock
KEYS[2] = redisson_rwlock:{anyLock}

ARGV[1] = 0
ARGV[2] = 30000
ARGV[3] = UUID_01:threadId_01:write

下面来分析一下lua脚本

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

这几行不用多说,先获取anyLock这个hash表中key为mode对应的值,如果不存在的话,锁肯定是已经释放或者过期了

if (mode == ‘write’) then
如果是写锁的话才会继续执行,不是的话直接返回1

local lockExists = redis.call(‘hexists’, KEYS[1], ARGV[3]);
if (lockExists == 0) then

判断anyLock这个hash表中key=UUID_01:threadId_01:write 是否存在,存在的话证明这个线程对应的写锁是存在的,不存在的话直接返回null

local counter = redis.call(‘hincrby’, KEYS[1], ARGV[3], -1);
if (counter > 0) then
redis.call(‘pexpire’, KEYS[1], ARGV[2]);

现在已经确定写锁是存在的,并且需要释放,那这个参数hincrby之前见过好多次了,就是增量更新命令,这里给的是-1,所以是将anyLock这个hash表中key=UUID_01:threadId_01:write,对应的value值-1,并且返回更新后的值。这里就是处理可重入锁的逻辑

如果这个更新后的值大于0的话,证明还有读锁需要释放,这个锁不能过期,那就更新一下过期时间。

redis.call(‘hdel’, KEYS[1], ARGV[3]);
走到这里的话,证明这个写锁没有重入,那就删除anyLock这个hash表中key=UUID_01:threadId_01:write的键值对。

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

这个命令就很有意思了,hlen命令是获取anyLock这个hash表中还有多少键值对,如果是1个的话,那肯定是只剩下mode这个key了,删除这个anyLock,广播一下就结束了

但是如果大于1个的话,就说明还有其他的key
那什么情况下还会有多余的key呢,写锁是互斥的,只能重入,但是可重入的逻辑在上面已经处理过了。那这里的其他key就只能是这个线程后来加的读锁了。
所以这里就是为了处理写锁+读锁的情况

redis.call(‘hset’, KEYS[1], ‘mode’, ‘read’);
如果释放完写锁,还存在其他锁,那这个锁一定是读锁,所以就将mode变成read,此时这个写锁就完全变成读锁了,等待读锁逻辑的处理。

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

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

相关文章

SQL手工注入漏洞测试(MongoDB数据库)靶场通关攻略

构造数据回显 });return ({title:1,content:2 成功回显1,2,接下来我们开始尝试查询数据库 });return({title:tojson(db),content:2 得到之后我们就可以继续查询他的表名了 });return({title:tojson(db.getCollectionNames()),content:2 最后我们就可以爆出他表里的数…

宝塔面板配置FTP服务并安装内网穿透实现无公网IP远程连接

文章目录 前言1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 前言 本文主要介绍宝塔FTP文件传输服务如何搭配内网穿透工具,实现随时随地远程连接局域网环境搭建的宝塔FTP文件服务并进行文件…

ssrf实现.SSH未创建写shell

一、介绍SSRF漏洞 SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相…

C语言基础——函数详解

目录 函数的概述 1 函数的概念 2 函数的意义 函数的定义和使用 1 函数的定义 2 函数的调用 2.1 在同一文件中函数定义后函数调用 2.2 在同一文件中函数定义前函数调用 2.3 调用其它文件中定义的函数 2.3.1 在函数调用文件中进行声明 2.3.2 在头文件中进行函数的声明 函…

图片工具箱:一键批量加水印,守护创意,提升效率!

前言 你是否曾在处理海量图片时,被繁琐的步骤和漫长的等待时间折磨得苦不堪言?是否梦想过拥有一款神器,能让你的图片处理工作变得轻松愉快,从此告别加班的烦恼,迎接升职加薪的曙光?那么,让我向…

有限差分学习笔记

有限差分介绍 ​ 在数学中,有限差分法(finite-difference methods,简称FDM),是一种微分方程数值方法,是通过有限差分来近似导数,从而寻求微分方程的近似解。 由泰勒展开式的推导 显式方…

Web应用加密数据传输方案

目录 概述 最初的方案 改进后的方案 秘钥的过期时间 概述 介于公司最近发布了一个面向C端用户的Web系统,为防止前端调用后端的API接口时,数据传输的内容轻易的被黑客获取,而设计的一个前后端数据加密传输方案 最初的方案 在最开始&#xf…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书,有时在项目中需要使用免费的 SSL 证书,Aliyun 提供免费证书,三个月有效期,可以直接在aliyun 申请,搜索 SSL 证书,选择测试证书。 Aliyun 证书需要每三月来来换一次,页…

<数据集>车内视角行人识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:6470张 标注数量(xml文件个数):6470 标注数量(txt文件个数):6470 标注类别数:1 标注类别名称:[pedestrian] 序号类别名称图片数框数1pedestrian647029587 使用标注…

奔驰S迈巴赫S480升级动态按摩座椅效果怎么样

在迈巴赫 S480 的尊崇之旅中,舒适从未有尽头。现在,为您呈现前排动态按摩座椅的升级,将舒适体验提升至全新境界。 迈巴赫 S480 已然是舒适的代名词,但前排动态按摩座椅的升级,将为您带来前所未有的放松与享受。 当您…

网络UDP报文详细解析

目录 一、简介二、详细介绍三、其他相关链接1、TCP报文段的详细图总结2、TCP三次握手和四次挥手详解3、socket通信原理及相关函数详细总结4、网络包IP首部详细解析 一、简介 本文主要介绍UDP报文格式。 二、详细介绍 UDP是一种无连接、不可靠的用户数据报协议,其…

【注解】反序列化时匹配多个 JSON 属性名 @JsonAlias 详解

JsonAlias 注解是 Jackson 提供的一个功能强大的注解,允许一个字段在反序列化时匹配多个 JSON 属性名。它适用于在处理多种输入数据格式时,或当 JSON 数据的键名可能变化时。 一、JsonAlias 的作用 多种别名:JsonAlias 允许你为一个字段定义…

MySQL在Windows和Ubuntu上的安装与远程连接配置

MySQL是一个广泛使用的开源关系数据库管理系统,适用于各种操作系统。本文将详细介绍如何在Windows和Ubuntu系统上安装MySQL,并配置远程连接。 1. 在Windows上安装MySQL 1.1 下载MySQL安装包 首先,访问MySQL官方网站(https://de…

UEFI 01记: 开发环境 在 ubuntu22 中搭建 edk2 开发环境并运行简单示例

https://uefi.org 1,预备环境 $ sudo apt install uuid-dev $ sudo apt install nasm $ sudo apt install bison flex $ sudo apt install build-essential $ sudo apt-get install x11proto-xext-dev $ sudo apt-get install libx11-dev $ sudo apt-get install l…

[数据集][目标检测]管道漏水泄漏破损检测数据集VOC+YOLO格式2614张4类

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2614 标注数量(xml文件个数):2614 标注数量(txt文件个数):2614 标注…

[windows][apache]Apache代理安装

下载apache服务软件和VC_redist安装包 https://www.apachelounge.com/download/ https://www.microsoft.com/zh-CN/download/details.aspx?id48145 解压文件,修改httpd.conf文件 37行出修改文件的解压目录 60行修改监听端口 安装服务 进入apache的目录&#xf…

美团mtgsig 1.2算法分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

帮助我们从曲线图中获取数据的软件分享——GetData Graph Digitizer

在科技论文写作和数据分析过程中,我们常常需要将自己的数据与前人的研究成果进行对比。然而,有时我们只能从别人的论文中获得一张包含坐标轴的曲线图,而无法直接获取原始数据。在这种情况下,GetData Graph Digitizer 软件就显得尤…

人眼检测(单张图像)

生产资料私有化,是阻碍社会发展(包括学习)的一大阻力。希望更多学习资料公出供学习。 目录 实验原理 示例代码 运行结果 注意事项: 在OpenCV中使用C对中可以读取图像文件,检测图像中的人脸和眼睛,并在检测到的眼睛位置绘制矩…

Telnet详解与应用——从原理到实战模拟

1. 引言 在现代网络管理中,远程访问和控制设备的能力至关重要。Telnet是一种经典的远程访问协议,尽管在安全性方面逐渐被SSH等更现代化的协议取代,但其在早期网络管理中的广泛使用使其成为网络工程师的基本技能之一。本文将深入探讨Telnet的…