【八股】Redisson分布式锁

Redisson分布式锁

主要了解了Redisson分布式锁实现的三个功能:

1.可重入 -> 防止死锁

2.可重试(i.e. 非阻塞获取锁)

3.自动续约

1. 可重入

原理:

利用Redis的Hash结构,记录了使用当前锁的线程id和重用次数,避免了可能造成的死锁问题。

存储的锁的内容如下图所示:

2. 可重试

不会一直去重试获取锁造成cpu资源的浪费 ,而是通过pubsub还有信号量的机制,实现了只有当别的线程释放锁,才会唤醒当前未成功获取锁的线程继续去尝试获取锁,
Redis的pubsub机制:

信号量:

3. 自动续约 (看门狗机制)

只有当我们不指定leaseTime,也就是不指定持有锁的时间长度时,才会启动看门狗机制。如下图所示:

默认的看门狗机制时把持有锁的剩余时长指定为30秒,然后每过leaseTime的1/3,默认就是10秒,就会重置持有锁的剩余时长为30秒。我们也可以修改Redisson的配置,把默认持有锁时长30s改成自己想要的时长。

看门狗机制的实现如下:

有个方法(renewExpiration)会启用一个延时任务,每次过了 1/3 leastTime时就会重置持有锁的TTL,重置完只有然后再调用自己,就实现了不断给锁续约的效果。

参考文章:

redisson中的看门狗机制总结

相关推荐
wanghowie31 分钟前
01.07 Java基础篇|函数式编程与语言新特性总览
java·开发语言·面试
Cricyta Sevina37 分钟前
Java IO 基础理论知识笔记
java·开发语言·笔记
小萌新上大分1 小时前
java线程通信 生产者消费者,synchronized,,ReentrantLock,Condition(笔记备份)
java·多线程·lock·java线程间通信的方式·reentrantlock使用·生产者消费者问题java·java多线程与高并发
それども1 小时前
Spring Bean 的name可以相同吗
java·后端·spring
墨雪不会编程1 小时前
C++ string 详解:STL 字符串容器的使用技巧
java·开发语言·c++
Lucky GGBond1 小时前
实践开发:老系统新增字段我是如何用枚举优雅兼容历史数据的
java
悲喜自渡7211 小时前
Python 编程(gem5 )
java·linux·开发语言
xing-xing2 小时前
JVM 内存、直接内存、系统内存、本地内存、物理内存总结
java·jvm
yangpipi-2 小时前
《C++并发编程实战》第5章 C++内存模型和原子操作
android·java·c++
qq_12498707533 小时前
基于微信小程序的电子元器件商城(源码+论文+部署+安装)
java·spring boot·spring·微信小程序·小程序·毕业设计