本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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中会记录着进来锁的状态 写 + 读 :等待写锁释放 才能读到新数据(读被阻塞) 写 + 写 : 阻塞方式(后面写锁等待前面写锁释放)
读 + 写 :有读锁 写也需要等待(写锁:等你读完这一次 我再改写) 只要有写锁的存在,都必须等待。