首先关于redisson的介绍,这里就不搬运了,贴一下github原地址:
由于我这里只是简单使用了redisson的 分布式锁
的功能,这里仅记录下锁的简单使用。
官方文档:8.分布式锁和同步器
此次所用锁为可重入锁
8.1. 可重入锁(Reentrant Lock)
基于Redis的Redisson分布式可重入锁RLock
Java对象实现了java.util.concurrent.locks.Lock
接口。同时还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。
1 | js复制代码RLock lock = redisson.getLock("anyLock"); |
大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。
另外Redisson还通过加锁的方法提供了leaseTime
的参数来指定加锁的时间。超过这个时间后锁便自动解开了。
1 | js复制代码// 加锁以后10秒钟自动解锁 |
Redisson同时还为分布式锁提供了异步执行的相关方法:
1 | js复制代码RLock lock = redisson.getLock("anyLock"); |
RLock
对象完全符合Java的Lock规范。也就是说只有拥有锁的进程才能解锁,其他进程解锁则会抛出IllegalMonitorStateException
错误。但是如果遇到需要其他进程也能解锁的情况,请使用分布式信号量Semaphore
对象.
首先springboot整合redisson需要引入redisson的依赖:
1 | js复制代码<dependency> |
亲测以上版本,配合springboot:2.2.5.RELEASE
版本,正常使用。
单机版redis的配置文件跟原来springboot集成redis一样。
1 | yaml复制代码spring: |
Redis配置映射类 RedisConfigProperties.java
1 | typescript复制代码 |
添加自动装配类:RedissonConfig.java
1 | js复制代码 |
创建测试接口测试分布式锁:
1 | java复制代码package gc.cnnvd; |
上面的代码看着很乱,当时摸索着打的日志,为了更好的理解加锁与解锁机制。
在 testLock11
接口里面添加线程睡眠,模仿程序运行占用锁,这时可以在redis里面看到我们加锁的key:
刚开始一直没有找到key,后来才发现,线程运行完成后,自动释放了锁,后面把睡眠时间拉长,才找到redis里面的key。
后面在用到代码里面,对加锁和锁的判断使用如下:
- 设置加锁的唯一标识
- 获取锁,并持有,做自己的业务逻辑
1 | csharp复制代码// 尝试获取锁-异步,第一个时间表示:最多等待时间,第二个时间参数表示:上锁以后多久自动解锁 |
这里判断加锁我使用了:lock.isLocked() && lock.isHeldByCurrentThread()
,这样可以确保只有一个线程进入锁的部分。
释放锁的时候,又加了一个判断:lock.isLocked()
,避免由于业务逻辑耗时超过锁的自动释放时间,在执行lock.unlock();
时,如果锁已经释放,或者别的线程拿到锁了,当前线程释放锁会抛出异常:
- 手动释放或者到期自动释放
- Error processing condition on org.springframework.boot.autoconfigure.cache.S
首次添加redisson依赖后,原来的redis配置不好使了,项目启动就报了上面的错。最后切换实例化CacheManager
参考 SpringBoot通过Cacheable注解完成redis缓存功能
redisson入门可参考:# SpringBoot整合Redisson(单机版)
集群版配置文件可参考:redisson版本_SpringBoot整合Redisson(集群版)
- o.redisson.client.handler.CommandsQueue : Exception occured. Channel:
刚开始由于使用了旧版本的redisson,发现项目启动后不久,控制台抛出此异常
参考:
切换redisson版本,解决此异常。
其他参考博客:
REDIS分布式锁REDISSON扩展 这篇博客结合AOP整合了redisson锁,值得学习下。
锁的相关概念,理解:分布式锁,redisson是如何解决死锁问题
如果翻到了最后,就再推荐一篇通俗易懂的博客: Spring Boot整合Redis实现简单的分布式锁
SpringBoot整合Redisson实现分布式锁
本文转载自: 掘金