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做缓存

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

相关推荐
金色光环1 分钟前
【DSP学习】增强型脉宽调制 EPWM 实验-基于普中DSP开发攻略
单片机·学习·dsp开发
小英雄大肚腩丶4 分钟前
RabbitMQ消息队列
java·数据结构·spring boot·分布式·rabbitmq·java-rabbitmq
fengxin_rou17 分钟前
用户模块架构实战:DTO 与 Domain 分层、Optional 空值处理、事务只读优化详解
java·后端·架构·用户实战
MXsoft61835 分钟前
**一套平台管全域****IT****:分布式一体化监控的实战演进**
分布式
笔夏40 分钟前
【安卓学习之FloatingActionButton】按钮太小
android·学习
环流_1 小时前
Redis ZSet
数据库·redis·缓存
吃好睡好便好1 小时前
汪国真的诗歌《假如你不够快乐》摘录
学习
KKei16381 小时前
Flutter for OpenHarmony学习目标追踪应用技术文章
学习·flutter·华为·harmonyos
redaijufeng1 小时前
C++构造函数详解:从基础原理到实际应用
java·jvm·c++
古怪今人1 小时前
etcd分布式键值存储系统 Windows下搭建etcd集群
数据库·分布式·etcd