分布式读写锁-redisson的读锁和写锁

417 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

redis(redisson)的读写锁实例测试

redisson的解决方案:

针对正在被改写的数据(且改写耗时,想拿到最新数据),让其被读阻塞等到写完成后,读最新数据。 保证一定能读到最新数据


    @GetMapping("write")
    @ResponseBody
    public String writeValue(){
        String s = "";
        RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");
        RLock rLock = lock.writeLock();
        try{
            //1.改数据加写锁 读数据加读锁
            rLock.lock();
            s = UUID.randomUUID().toString();
           Thread.sleep(15000);
           redisTemplate.opsForValue().set("writeValue",s);
       }catch (InterruptedException e){
           e.printStackTrace();
       }finally {
            rLock.unlock();
        }

        return s;
    }

    @GetMapping("read")
    @ResponseBody
    public String readValue(){
        String s = "";
        RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");
        //加读锁
        RLock rLock = lock.readLock();
        try{
            rLock.lock();
            s = redisTemplate.opsForValue().get("writeValue");

        }catch (Exception e){
            rLock.unlock();
            e.printStackTrace();
        }

        return s;
    }

总结:

读写锁: 保证一定能读到最新数据,修改期间,写锁是一个排他锁(互斥锁)。读锁是一个共享锁。 写锁没释放,读锁就必须等待。 针对读数据时,只要当前正在修改数据,读数据就会等待写完成后,拿到最新数据。

多状况测试: 读 + 读 :相当于无所 n请求可以同时加锁成功 redis中会记录着进来锁的状态 写 + 读 :等待写锁释放 才能读到新数据(读被阻塞) 写 + 写 : 阻塞方式(后面写锁等待前面写锁释放)
读 + 写 :有读锁 写也需要等待(写锁:等你读完这一次 我再改写) 只要有写锁的存在,都必须等待。