Redisson 分布式锁

  • Redis是基础客户端库,可用于执行基本操作。

  • Redisson是基于Redis的Java客户端,提供高级功能如分布式锁、分布式集合和分布式对象。

  • Redisson提供更友好的API,支持异步和响应式编程,提供内置线程安全和失败重试机制。

实现步骤:

 
            org.redisson
            redisson
            3.12.0
        

@Configuration
public class MyRedissonConfig {

    @Bean
    public RedissonClient redisson(){
        Config config = new Config();
        config.useSingleServer().setAddress("redis://192.168.127.129:6379");
        RedissonClient redissonClient = Redisson.create(config);
        return redissonClient;
    }
}

通过导入坐标和配置,注入RedissonClient对象之后,就可以通过API操作

如:获取可重入锁

@ResponseBody  //因为返回的是json数据
    @GetMapping("/hello")
    public String hello(){
        //获取一把锁  只要锁的名字一样就是通一把锁   是一个可重入的锁
        RLock myLock = redissonClient.getLock("myLock");

        /**
         *
         * 默认都是30s
         * 加锁   阻塞式等待  锁的自动续期看门狗原理(如果业务超长,会在运行期间自动给锁续上新的30秒)
         * 不要担心锁自动过期被删除
         * 加锁的业务完成,就不会续期,即使不手动解锁,锁也会在30秒之后自动解锁  所有不会有死锁问题
         */

//        myLock.lock();//阻塞式等待

        myLock.lock(10, TimeUnit.SECONDS);//获取锁之后10秒之后自动解锁  不会自动续期  自动解锁时间一定要大于业务执行事件   注意使用
        try {
            //业务代码
            System.out.println("加锁成功 执行业务。。。。"+ Thread.currentThread().getId());
            Thread.sleep(20000);
        }catch (Exception e){

        }finally {
            //解锁
            System.out.println("释放锁。。。。"+ Thread.currentThread().getId());
            myLock.unlock();
        }



        return "hello";
    }

读写锁:保证一定能读到最新数据,修改期间写锁是一个排他锁

        如果都是读,则都会同时加锁成功,可以理解为无锁

        如果先写后读,则必须等待写锁释放才行

        如果同时写,也必须等待写锁释放才行,阻塞的方式、如何

        如果先读后写,也必须等待读锁释放

写锁:是一个互斥锁

读锁:是一个共享锁,和无锁是一样的

        

@ResponseBody  //因为返回的是json数据
    @GetMapping("/read")
    public String readValue(){
        //获取读写锁
        RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("rw-Lock");
        String s = "";
        RLock rLock = readWriteLock.readLock();
        rLock.lock();
        try{
            s = redisTemplate.opsForValue().get("rwLock");
        }catch (Exception e){

        }finally {
            rLock.unlock();
        }
        return s;
    }

    @ResponseBody  //因为返回的是json数据
    @GetMapping("/write")
    public String writeValue(){
        //获取读写锁
        RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("rw-Lock");
        RLock rLock = readWriteLock.writeLock();
        String s = UUID.randomUUID().toString();
        try{
            rLock.lock();
            redisTemplate.opsForValue().set("rwLock", s);
            Thread.sleep(30000);
        }catch (Exception e){

        }finally {
            rLock.unlock();
        }
        return s;
    }

 信号量:典型案例车库停车等。。。。

Redisson 分布式锁_第1张图片

闭锁:案例放假 锁门Redisson 分布式锁_第2张图片 

 

 

你可能感兴趣的:(分布式)