关于缓存的一些总结(5)
我们虽然之前已经通过redis的客户端实现了分布式锁,但是redis官网并不提倡这么做
image.png
它推荐我们使用redission
image.png
本章就来讲解一个非常重要的工具--redisson
官网:https://redisson.pro/
github学习:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95
入门实例--可以通过github的官方文档的快速入门进行配置,当然如果你使用的是springboot,有个快速启动包,用到再说吧
第一步:导入依赖包
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.15.0</version>
</dependency>
第二步:编写配置文件
第三步:单元测试,看是否能拿到redisClient实例
image.png
第四步:通过redisClient进行分布式锁的操作
image.png
注意:测试时需要同时访问应用,看是否一个请求访问,另一个在等待。
原理跟我们之前使用redis是一样的,redisson会在redis数据库中写一个标识:
image.png
lock()方法的一些解读:
我们设想一种场景:如果我编写的业务代码,最后没有执行finally中的解锁代码,那么redisson会不会出现死锁问题呢?
答案是:不会
我们可以通过以上代码,通过浏览器发送一个请求,在代码休眠过程中,将代码暂停,也就意味着代码不会执行到解锁的地方,我们再次发送一个请求,发现请求过一会儿就可以访问到结果,这也是redisson强大的地方:即使代码运行过程中出现异常,也不会出现死锁的问题。
大致可以解释为:
1、锁的自动续期,如果业务超长,运行期间自动给锁续上新的30s。不用担心业务时间长,锁自动过期被删除
2、加锁的业务只要运行完成,就不会给当前锁续期,即使不动手解锁,锁默认在30s以后也会自动删除。
image.png
关于Redisson实现分布式锁的一些延伸:
1、分布式闭锁操作
什么是闭锁呢?比如学校放假,学校有五个班级,每走一个班级就减一,直到为0,锁才关闭。记好了,这个是分布式的,就是不管运行多少个应用,计数单位都是5个。
image.png
2、信号量的操作:省略
3、读写锁等
以上都可以自行学习,都在官网的文档中,也不难。