Redisson分布式锁
一、Redisson分布式锁的加锁机制?
- 为什么需要分布式锁?有哪些应用场景?
- 在分布式
- 分布式锁的加锁机制?以tryLock为例
(1) tryAcquire 尝试获取锁。
首先通过tryAcquire方法尝试获取锁,如果获取锁成功,返回ttl为null,如果获取锁失败,返回已经被持有锁的ttl。
tryAcquire方法的核心是通过一段LUA脚本,去redis中创建一个hash,该hash的key是锁的key,hash中的一个Key是一段字符串加一个线程ID,对应的value是持有锁的线程进入锁的次数。
- 首先判断这把锁是否存在,不存在的话,直接获取锁。value=1.
- 如果锁已经存在,判断当前线程是否持有这把锁,如果是,则给锁的进入次数加1,value=value + 1.
- 如果锁已经存在,但是是别的线程持有锁,则返回锁的TTL。
(2) 第一次没有获取到锁,订单锁释放的消息。
通过设定await的超时时间,如果超时了还没有监听到锁释放的消息,就认为获取锁超时。
(3) 循环尝试获取锁,直到成功或者超时。
- 尝试获取锁。获取到了就退出,返回获取成功。
- 没有获取到锁,计算是否有剩余时间。如果没有时间就退出,返回获取失败。
- 还有时间,比较剩余时间和已经存在锁的TTL的大小关系。取较小值,继续等待锁释放。
- 锁释放后,计算是否有剩余时间。还有就回到第一步,没有就退出,返回获取失败。
- 分布式锁的特点有哪些?
- 互斥。同一时刻只能有一个线程获得锁。
- 防止死锁。避免因系统故障或者其他原因导致线程无法释放锁,其他线程获取不到锁,造成死锁。有必要设置锁的有效时间,到期后自动释放锁。
- 性能。减少锁等待的时间,避免导致大量线程阻塞。(1)锁的颗粒度尽量小。(2)锁的范围尽量小。
- 可重入。同一个线程可以重复拿到同一个资源的锁。
二、Redisson分布式锁的自动续期问题?
- 为什么锁需要自动续期?
- 如果线程1持有锁只有1s时间,但是处理逻辑需要2秒,在线程1还未处理完之前,线程2获取了锁,并且与线程1处理同一段业务逻辑。这样会造成数据错误。并且线程1解锁时会失败,因为加锁线程不是线程1了。
- 为了避免出现上述情况,所以需要自动续期。
- 什么时候进行锁的自动续期?
- 在源码中开启了定时任务。定时间隔是看门狗时间的三分之一,也就是10s. 所以锁每隔10s延长到30s。
- 怎么做锁的自动续期?
- 开启定时任务new TimerTask()来自动续期。间隔是看门狗时间三分之一,也就是10s。
三、Redisson分布式锁是怎么做到互斥的?
四、Redisson分布式锁如何防止死锁?
为锁设置过期时间防止死锁。
五、Redisson分布式锁代码实践。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界