redis及实现分布式锁的原理

redisson分布式锁原理:

一部分逻辑是拿锁,如果key不存在则获取锁成功,为避免锁没有释放造成死锁默认leasetime(过期时间))30s,看门狗机制会定时判断线程存在就重新设置过期时间续期,以免锁错误释放被别人抢到。如果key存在会判断是不是本身已经加过锁,是的话增加锁重入次数。

即如果你指定了 leaseTime:Redisson 认为你要自己控制锁的时间,它只负责设锁,不负责续期。时间一到,锁直接释放,即使业务没跑完也可能发生并发问题(业务超时)。

如果你没指定 leaseTime (默认情况):Redisson 默认给你 30 秒的持有时间。一旦你成功抢到锁(ttlRemaining == null),Redisson 会立刻在后台启动一个看门狗线程。看门狗会不断给你"续期",防止你业务还在跑,锁却过期了被别人抢走。

另一部分是拿到锁之后的看门狗逻辑

延迟: 每次任务不会立即执行,而是等 10 秒(1/3 过期时间)。

执行: 到了时间,去 Redis 检查锁是否还存在并重置过期时间("看门")。这里是异步执行Lua脚本实现的

递归: 如果重置成功,就再次调用自己,安排下一次 10 秒后的检查。

并发安全: 使用 expirationRenewalMap 和 putIfAbsent 确保多线程环境下不会启动多个重复的定时任务。即每个锁一个看门狗任务。

Redisson 能够让锁在业务运行期间一直"活着",直到业务主动解锁的秘密。

这里的定时任务是用netty的HashedWheelTimer实现的,控制时间轮转动,将任务放到对应的轮次分片上,并执行当前时间轮的任务,类似循环队列,对时间取模,如果不是本轮次的则减一直到为0表示是当前轮次

另一部分逻辑是没有获取到锁时,如果有等待时间,会阻塞去再次拿锁,用semaphore实现,并且创建消息监听,当锁释放时会接收消息去重新获取锁。

补充:

redis做缓存

如果缓存里没有,去查数据库。为了避免全都打到数据库,加锁串行执行,保证一个线程去查,查到之后存缓存,剩下的都会继续从缓存里查,这里做了双重检查。

相关推荐
许彰午6 小时前
14_Java泛型完全指南
java·windows·python
lengxuemo6 小时前
ICC2学习笔记之Placement and Optimization
笔记·学习
温柔只给梦中人7 小时前
NLP学习:注意力机制
人工智能·学习·自然语言处理
智慧物业老杨7 小时前
司法绿色通道下的物业纠纷数智化解决方案——基于“三优先“机制的全流程技术落地实践
java·django
2601_961194027 小时前
2026初级会计实务公式总结大全|计算题公式手册PDF
java·spring·eclipse·pdf·tomcat·hibernate
做个文艺程序员7 小时前
第1篇:K8s 核心概念精讲:Pod、Deployment、Service 与 Namespace——Java 开发者快速上手指南
java·云原生·容器·kubernetes·容器编排
IT龟苓膏7 小时前
Redis 数据类型底层原理:SDS、quicklist、intset、skiplist、Bitmap、HyperLogLog 一篇讲清
数据库·redis·skiplist
逐影者3978 小时前
ch592f学习
学习
小满Autumn8 小时前
MVVM Light 架构笔记:定位器、命令、消息与 IoC 实践
笔记·学习·架构·c#·上位机·mvvm
蓝黑墨水8 小时前
动画角色的整个流程
学习