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

相关推荐
一叶飘零_sweeeet20 小时前
从手写 Redis 分布式锁到精通 Redisson:分布式系统的并发控制终极指南
redis·分布式·redisson
能摆一天是一天20 小时前
JAVA stream().flatMap()
java·windows
睡觉的时候不会困20 小时前
Redis 主从复制详解:原理、配置与主从切换实战
数据库·redis·bootstrap
颜如玉21 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员的世界你不懂1 天前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年1 天前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
在未来等你1 天前
Kafka面试精讲 Day 13:故障检测与自动恢复
大数据·分布式·面试·kafka·消息队列
自学也学好编程1 天前
【数据库】Redis详解:内存数据库与缓存之王
数据库·redis
cui_win1 天前
基于Golang + vue3 开发的 kafka 多集群管理
分布式·kafka
iiYcyk1 天前
kafka特性和原理
分布式·kafka