Redisson锁的redis数据结构

lock_name作为key,

value为hash,hash最多只会有一条数据hash的key为uuid+:+threadId,value为重入次数

uuid:每个RedissonClient里面连接管理中的id=uuid,创建时初始化

加锁lua脚本(copy from version 3.13.6)

KEYS[1] 锁的名字

ARGV[1] 锁自动失效时间(毫秒,默认30s(看门狗续期时长))

ARGV[2] hash子项的key(uuid+threadId)

--如果锁不存在
if (redis.call('exists', KEYS[1]) == 0) then
--重入次数初始为0后加一
redis.call('hincrby', KEYS[1], ARGV[2], 1);
--设锁的过期时间
redis.call('pexpire', KEYS[1], ARGV[1]);
--返回null-代表加锁成功
return nil;
--if结束符
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]);
--返回null-代表重入成功
return nil;
--if结束符
end;
--返回锁的剩余时间(毫秒)-代表加锁失败
return redis.call('pttl', KEYS[1]);

客户端接收到返回值为毫秒值(锁的失效时间),则会进行循环判断,不停的尝试获取

解锁lua脚本

KEYS[1] 锁的名字

KEYS[2] 发布订阅的channel=redisson_lock__channel:{lock_name}

ARGV[1] 发布订阅中解锁消息=0

ARGV[2] 看门狗续期时间

ARGV[3] hash子项的key=uuid+threadId

--如果锁不存在
if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) then
--返回null-代表解锁成功
return nil;
end;
--重入次数减一
local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1);
--如果重入次数不为0,对锁进行续期(使用看门狗的续期时间,默认续期30s)
if (counter > 0) then
redis.call('pexpire', KEYS[1], ARGV[2]);
--返回0-代表锁的重入次数减一,解锁成功
return 0;
--否则重入次数<=0
else
--删除key
redis.call('del', KEYS[1]);
--向channel中发布删除key的消息
redis.call('publish', KEYS[2], ARGV[1]);
--返回1-代表锁被删除,解锁成功
return 1;
end;
return nil;

看门狗续期lua脚本

io.netty.util.TimerTask每10秒执行一次(30(续期时间)/3)

KEYS[1] 锁的名字

ARGV[1]

--自己加的锁存在
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then
--续期
redis.call('pexpire', KEYS[1], ARGV[1]);
--1代表续期成功
return 1;
end;
--自己加的锁不存在,后续不需要再续期
return 0;

Redisson lua脚本解读相关推荐

  1. 【2020尚硅谷Java大厂面试题第三季 04】Redis 9种数据类型使用场景,分布式锁演变步骤,lua脚本,redis事务,Redisson,Redis内存占用,删除策略,内存淘汰策略,手写LRU

    1.安装redis6.0.8 2023 02 02 为:redis-7.0.8.tar.gz 2.redis传统五大数据类型的落地应用 3.知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的 ...

  2. Redission实现分布式锁完美方案 以及 Lua 脚本浅谈

    Redission实现分布式锁完美方案 以及 Lua 脚本浅谈 文章目录 Redission实现分布式锁完美方案 以及 Lua 脚本浅谈 前言 常见分布式锁方案对比 分布式锁需满足四个条件 Redis ...

  3. Redis分布式锁—SETNX+Lua脚本实现篇

    前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题. 针对分布式锁的实现,目前比较常用的就如下几种 ...

  4. 高性能分布式缓存Redis(缓存分类 安装 数据类型选择和应用场景 发布订阅 事务 Lua脚本 慢查询日志)

    高性能分布式缓存Redis 高性能分布式缓存Redis 1. 缓存发展史&缓存分类 1.1 大型网站中缓存的使用 1.2 常见缓存的分类 1.3 分布式缓存选型方案对比 2. Redis概述& ...

  5. redis中使用lua脚本

    一.概述 1.什么是lua脚本 Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放. 其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.因为广泛的应用于:游戏开 ...

  6. redis-cli redisTemplate执行Lua脚本,解决redisTemplate.opsForSet().members获取数据问题

    解决问题-问题描述 在使用redisTemplate.opsForSet().members(key)获取key String; value Set<Entity>数据时候出现如下问题. ...

  7. 【面试 分布式锁详细解析】续命 自旋锁 看门狗 重入锁,加锁 续命 解锁 核心源码,lua脚本解析,具体代码和lua脚本如何实现

    Redisson实现分布式锁原理 自己实现锁续命 在 controller 里开一个 线程 (可以为 守护线程) 每10秒,判断一个 这个 UUID是否存在,如果 存在,重置为 30秒. 如果不存在, ...

  8. Redis Lua脚本大学教程

    前面我们已经把Redis Lua相关的基础都介绍过了,如果你可以编写一些简单的Lua脚本,恭喜你已经可以从Lua中学毕业了. 在大学课程中,我们主要学习Lua脚本调试和Redis中Lua执行原理两部分 ...

  9. Redis中使用Lua脚本(二)之红包雨的抢夺

    Redis中使用Lua脚本(二)之红包雨的抢夺 一.需求介绍 二.红包雨的需求分析及概要设计 三.红包雨的Lua脚本设计及模拟演示 四.Lua脚本在生产环境的使用 一.需求介绍 如同前两年的爆款&qu ...

  10. RedisSon高并发分布式锁实战RedisSon源码解读

    Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁,如果是分布式系统,跑在不 ...

最新文章

  1. 给你总结了这些对付幂等性的套路
  2. java小编程----三数之和
  3. git tag和branch的区别
  4. 一个具体的例子学习SAP S/4HANA里Fiori应用的排错分析
  5. python爬取知乎live_Python爬虫从入门到放弃(十九)之 Scrapy爬取所有知乎用户信息(下)...
  6. encoder.cpp(340) [feature_index.open(templfile, trainfile)]feature_index.cpp(174) [max_size == size]
  7. Android学习笔记(四):android画图之paint之setXfermode
  8. Android程序暂停sh,init进程 解析Android启动脚本init.rc 修改它使不启动android init.rc中启动一个sh文件...
  9. python双色球代码_python实现双色球随机选号
  10. python3抠图并更换背景
  11. Hive distribute 问题
  12. joda DateTimeFormatter simpleDateFormat
  13. ModbusPoll和ModbusSlave使用(搭配VSPD,串口接收发数据)
  14. 群晖docker部署带web容器的端口配置
  15. System.InvalidOperationException:“寄宿的 HWND 必须是指定父级的子窗口。”
  16. 提高晚上学习效率的11个方法
  17. 典型的贪心算法~ (田忌赛马 )
  18. IIS7+PHP安装教程
  19. 统计学名词解释 —— 5.「样本均值」、「样本方差」与「样本中心矩」
  20. php 海关对接 进口商品_GitHub - kipp01/haiguan: 海关对接 订单申报 php xml加签

热门文章

  1. LVS学习笔记 5高可用集群原理
  2. 利用PS批量添加文件名到图片中
  3. SAP 金税解决方案
  4. 金税盘专、普红字发票开具步骤及(税盘注销方法)
  5. 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句倒装句(Reduced Clauses、Inverted Sentences) 【完结】...
  6. Neo4j下载与安装
  7. 学习笔记(4):《微电子器件》陈星弼(第四版)第2章 PN结
  8. 【年终总结系列 2017】求职之路
  9. 谷歌服务安装包_安卓手机安装谷歌服务框架和Google Play傻瓜式教程 100%好用
  10. winform backgroundWorker 用法