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

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

相关推荐
码农周3 小时前
告别大体积PDF!基于PDFBox的Java压缩工具
java·spring boot
苏渡苇3 小时前
Redis 版本演进、新特性与协议那些事儿
数据库·redis·缓存·开源协议·redis版本·redis新特性
devilnumber3 小时前
java中Redisson ,jedis,Lettuce和Spring Data Redis的四种深度对比和优缺点详解
java·redis·spring
摇滚侠3 小时前
Java 进阶教程,全面剖析 Java 多线程编程
java·开发语言
yaaakaaang3 小时前
十四、命令模式
java·命令模式
鬼蛟3 小时前
Nacos
数据库·redis·缓存
楼田莉子3 小时前
Linux网络:IP协议
linux·服务器·网络·c++·学习·tcp/ip
小锋java12344 小时前
【技术专题】Matplotlib3 Python 数据可视化 - Matplotlib3 绘制饼状图(Pie)
java
wuminyu4 小时前
专家视角看JVM_StartThread
java·linux·c语言·jvm·c++
码农阿豪4 小时前
一次 AI 调用 15 万 Token 只花了 $0.058?彻底搞懂 Token、缓存读、补全计费机制!(附完整架构图)
人工智能·spring·缓存