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

相关推荐
霸道流氓气质2 分钟前
Spring AI Function Calling实现原理与自定义函数
java·spring·microsoft
OPEN-F3 分钟前
C++并发编程:条件变量与原子操作
java·开发语言·c++
南城以南溫暖如初14715 分钟前
社群电商实战指南:从零搭建高转化社区的技术架构
java·spring boot·mysql·系统架构·vue·mybatis
南城以南溫暖如初14715 分钟前
会员返利商城系统开发实战:架构设计与实现指南
java·spring boot·mysql·vue·mybatis
Shaoshing26 分钟前
Java SE Java EE 和 JavaME区别
java
lhldsg42 分钟前
树洞倾诉的核心需求与产品定位误区
java·前端·小程序
Freak嵌入式1 小时前
MicroPython+Pico 接收空闲中断和发送空闲中断全实战
java·开发语言·stm32·单片机·嵌入式硬件
MetaLite1 小时前
SpringBoot防重复提交-加一把Redis锁就够吗
spring boot·redis·后端
计算机毕设定制辅导-无忧学长1 小时前
《基于SpringBoot的图书管理系统设计与实现》
java·spring boot·后端
小蒜学长1 小时前
借助于大模型工具Cursor的中药材交易系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端