Redisson分布式锁 --- 源码分析

1.获取一把锁

java 复制代码
RLock lock = redissonClient.getLock("订单lock");

2.业务代码加锁

java 复制代码
lock.lock();

2.1 lock.tryAcquire

java 复制代码
Long ttl = tryAcquire(leaseTime, unit, threadId);
复制代码

2.2 lua脚本: tryLockInnerAsync方法

如果获取锁失败,返回的结果是这个key的剩余有效期,如果获取锁成功,则返回null

getName="订单lock"

getLockName(threadId) = "abb26a86-01bb-4cc1-945c-d274ae2fd454:70" --->UUID:threadId

|--------------------------------------------------|-----------------------------|
| redis.exists:命令被用来检查键是否存在 | 若 key 存在返回 1 ,否则返回 0 |
| redis.hsetmyhash field value 为哈希表中的field字段赋值 | |
| redis.pexpire 命令用于设置键(key)的有效期限(以毫秒为单位) | 设置成功,返回 1 key 不存在或设置失败,返回 0 |
| redis.hexists 命令用于查看哈希表的指定字段是否存在 | 1:包含字段; 0:不包含字段或键不存在 |
| redis.hincrby myhash field 1 | 字段的增值操作后的值 |
| redis.pttl 命令以毫秒为单位返回 key 的剩余过期时间 | |

2.3 scheduleExpirationRenewal

getEntryName() = UUID+lockName ---> abb26a86-01bb-4cc1-945c-d274ae2fd454:订单lock

2.4 renewExpiration 方法异步更新锁的过期时间

3.看门狗锁续期

renewExpirationAsync

4.解锁

java 复制代码
lock.unlock();

4.1 解锁 -- unlockInnerAsync

4.2 移除锁 --- cancelExpirationRenewal

相关推荐
懒鸟一枚1 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123453 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑3 小时前
Sentinel安装
java·后端·微服务
六bring个六4 小时前
open Harmony中分布式软总线的学习任务清单
分布式·学习·c/c++·open harmony
凤凰院凶涛QAQ5 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
wuqingshun3141595 小时前
说一下 Kafka 中关于事务消息的实现?
分布式·kafka
掘金_答案6 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅6 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp6 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG4776 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程