分布式锁 & redisson

130 阅读2分钟

这是我参与「掘金日新计划 · 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;
    }
}

这里的单机模式配置可以参考官方文档提供的很详细

image.png 官方文档地址 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秒 (自动续期都是在不设置过期时) image.png

实践是检验真理的唯一准则,感兴趣的可以去试试呀!明天见咯 😃😃😃😃