当前位置: 首页 > news >正文

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.mrgr.cn/news/10995.html

相关文章:

  • 国产游戏技术的崛起:能否挑战全球引领地位?
  • 【单调栈】|代码随想录算法训练营第42天|42. 接雨水、 84.柱状图中最大的矩形
  • 王立铭脑科学50讲:29,敌对型社交,如何抑制自己的共攻击本能
  • 【搜索引擎】ElasticSearch 7.x版本
  • android aar适配uniapp
  • IDEA工具设置默认使用maven的settings.xml文件
  • 游戏开发设计模式之装饰模式
  • 汽车耐老化太阳跟踪聚光户外加速老化试验
  • 可集成多模型的机器人开发框架 dora:让机器人编程走向大众
  • HarmonyOS 鸿蒙获取微信授权和持续获取位置信息
  • 力扣1074.元素和为目标值的子矩阵数量
  • redisj集群之哨兵模式
  • SAP S4HANA 2023 FPS01 FAA虚拟机发布了
  • Upload-Lab第20关:如何利用文件名可控漏洞?
  • Redis面试都卷到C语言去了。。。
  • 文心快码 Baidu Comate 前端工程师观点分享:以文心快码 Baidu Comate为例,智能代码助手需要什么(三)
  • 北京青蓝智慧科技:2024(第九届)世界物联网大会将于11月在京举行
  • Visual Studio之安装(更新,扩展)速度缓慢解决方案
  • Intellij Idea + Git 完美实战!
  • CVPR 2024论文分享┆LMDrive:基于大模型的闭环端到端自动驾驶