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

相关推荐
汝生淮南吾在北41 分钟前
SpringBoot+Vue饭店点餐管理系统
java·vue.js·spring boot·毕业设计·毕设
冬夜戏雪4 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
CC.GG4 小时前
【C++】二叉搜索树
java·c++·redis
JIngJaneIL5 小时前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
南部余额6 小时前
踩坑与解惑:深入理解 SpringBoot 自动配置原理与配置排除机制
java·spring boot·自动配置原理·import
only-qi6 小时前
Redis如何应对 Redis 大 Key 问题
数据库·redis·缓存
木鹅.7 小时前
LangChain4j
java
永远都不秃头的程序员(互关)7 小时前
Java核心技术精要:高效实践指南
java·开发语言·性能优化
CoderYanger8 小时前
动态规划算法-子序列问题(数组中不连续的一段):28.摆动序列
java·算法·leetcode·动态规划·1024程序员节
代码栈上的思考8 小时前
深入解析Spring IoC核心与关键注解
java·后端·spring