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

分布式锁-redission可重入锁原理

5.3 分布式锁-redission可重入锁原理

在Lock锁中,他是借助于底层的一个voaltile的一个state变量来记录重入的状态的,比如当前没有人持有这把锁,那么state=0,假如有人持有这把锁,那么state=1,如果持有这把锁的人再次持有这把锁,那么state就会+1 ,如果是对于synchronized而言,他在c语言代码中会有一个count,原理和state类似,也是重入一次就加一,释放一次就-1 ,直到减少成0 时,表示当前这把锁没有被人持有。

在redission中,我们的也支持支持可重入锁

在分布式锁中,他采用hash结构用来存储锁,其中大key表示表示这把锁是否存在,用小key表示当前这把锁被哪个线程持有,所以接下来我们一起分析一下当前的这个lua表达式

这个地方一共有3个参数

KEYS[1] : 锁名称

ARGV[1]: 锁失效时间

ARGV[2]: id + “:” + threadId; 锁的小key

exists: 判断数据是否存在 name:是lock是否存在,如果==0,就表示当前这把锁不存在

redis.call(‘hset’, KEYS[1], ARGV[2], 1);此时他就开始往redis里边去写数据 ,写成一个hash结构

Lock{

​ id + “:” + threadId : 1

}

如果当前这把锁存在,则第一个条件不满足,再判断

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

此时需要通过大key+小key判断当前这把锁是否是属于自己的,如果是自己的,则进行

redis.call(‘hincrby’, KEYS[1], ARGV[2], 1)

将当前这个锁的value进行+1 ,redis.call(‘pexpire’, KEYS[1], ARGV[1]); 然后再对其设置过期时间,如果以上两个条件都不满足,则表示当前这把锁抢锁失败,最后返回pttl,即为当前这把锁的失效时间

如果小伙帮们看了前边的源码, 你会发现他会去判断当前这个方法的返回值是否为null,如果是null,则对应则前两个if对应的条件,退出抢锁逻辑,如果返回的不是null,即走了第三个分支,在源码处会进行while(true)的自旋抢锁。

"if (redis.call('exists', KEYS[1]) == 0) then " +"redis.call('hset', KEYS[1], ARGV[2], 1); " +"redis.call('pexpire', KEYS[1], ARGV[1]); " +"return nil; " +"end; " +"if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then " +"redis.call('hincrby', KEYS[1], ARGV[2], 1); " +"redis.call('pexpire', KEYS[1], ARGV[1]); " +"return nil; " +"end; " +"return redis.call('pttl', KEYS[1]);"

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.lryc.cn/news/339245.html

相关文章:

  • Android Gradle开发与应用 (八) :Kotlin DSL
  • phpstorm 快捷键
  • 浦大喜奔APP8.0智能升级,发力数字金融深化五大金融篇章服务
  • 自然语言处理、大语言模型相关名词整理
  • 移动开发避坑指南——内存泄漏
  • 太好玩了,我用 Python 做了一个 ChatGPT 机器人
  • STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡
  • 累积分布函数图(CDF)的介绍、matlab的CDF图绘制方法(附源代码)
  • 代码随想录算法训练营第四十一天|343.整数拆分、96不同的二叉搜索树
  • 全量知识系统 程序详细设计之 统一资产模型(QA-SmartChat)
  • 已解决org.springframework.web.client.HttpClientErrorException: 400异常的正确解决方法,亲测有效!!!
  • 内网渗透-Windows内网渗透
  • 机器人方向控制中应用的磁阻角度传感芯片
  • 如何在树莓派安装Nginx并实现固定公网域名访问本地静态站点
  • Ubuntu与主机windows共享文件夹
  • (四)C++自制植物大战僵尸游戏启动流程
  • 华为的AI战略地图上,才不是只有大模型
  • 采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
  • Vue3(三):生命周期、路由、自定义hooks
  • UE4_导入内容_骨架网格体
  • 第十五届蓝桥杯c++b组赛后复盘和真题展示
  • 代码随想录 二叉树—二叉搜索树中的搜索
  • ⑤-1 学习PID--什么是PID
  • 【OTA】STM32-OTA升级——持续更新
  • java 字符集
  • Alibaba --- 如何写好 Prompt ?
  • 用html写一个雨的特效
  • 前端 接口返回来的照片太大 加载慢如何解决
  • 003 传参
  • QT写Windows按键输出(外挂)