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

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

相关推荐
智购科技无人售货机厂家4 小时前
2026自动售货机制冷系统维护指南:从散热器清洁到压缩机换油的工程实践~YH
运维·redis·物联网·缓存·架构
EXI-小洲4 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
2601_961901705 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
是隼人5 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
何以解忧,唯有..6 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
大衛說6 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
QQ_21696290966 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
吃好睡好便好7 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学运维的Kysan7 小时前
暑假运维学习打卡第二十九天8.29
学习
前端 贾公子7 小时前
第09章:上下文与记忆 (2)
java·服务器·前端