这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
前言
本地 锁lock ReadWriteLock 、ReentrantLock、 ReentrantReadWriteLock等只能在本地使用,当服务部署多份时且需要使用锁时本地的所就不能锁住,今天我们的主角redisson 是专门处理分布式锁的。下面我们一起使用一下
引入依赖
#这里的版本根据自己的项目来就好了
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
添加配置类
@Configuration
public class MyredissonConfig {
@Bean
public RedissonClient redisson(){
Config config = new Config();//注意这里redis的地址需要rddis:// 开始
config.useSingleServer().setAddress("redis://192.168.1.7:6379");
RedissonClient redisson = Redisson.create(config);
return redisson;
}
}
这里的单机模式配置可以参考官方文档提供的很详细
官方文档地址 github.com/redisson/re…
可重入锁
基于Redis的Redisson分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口。同时还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。
下面我们使用一下可重入锁
@PostMapping("/test")
public R test(@RequestBody ListVo listVo) throws InterruptedException {
RLock lock = redissonClient.getLock("anyLock");
//加锁
lock.lock(); //注意这里的时阻塞式等待
try {
Thread.sleep(20);
}catch (Exception exception){
System.out.println("exception = " + exception);
}
lock.unlock();//解锁
return R.ok();
}
lock.lock(); //注意这里的时阻塞式等待没有指定锁的过期会自动续期(看门狗), 如果业务耗时超长实践,运行期间或自动给锁加上30秒的续期。不用担心业务实践太长 导致锁被删除。加锁的业务只要运行完成,就不会给当前锁续期 ,即使不手动解锁,也会在30秒后自动删除
lock.lock(10, TimeUnit.SECONDS); //设置10秒后自动释放锁
注意这里看门狗不会再去自动续期,会抛出解锁失败。如果使用这个锁这个解锁时间一点要大于业务时间,不然会出现 解锁失败的异常。因为A线程还没执行完,锁已经被释放。B又进来加锁这时A执行完业务去释放锁,就会出现问题。
下面我们看看看门狗续期时间
什么时候续期在 renewExpiration方法中,1/3时进行续期 看门狗的时间默认是30秒 (自动续期都是在不设置过期时)
实践是检验真理的唯一准则,感兴趣的可以去试试呀!明天见咯 😃😃😃😃