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 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅3 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者4 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺4 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart5 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP6 小时前
MyBatis-mybatis入门与增删改查
java
孟陬10 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌10 小时前
一站式了解四种限流算法
java·后端·go
华仔啊10 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java