-
Redis是基础客户端库,可用于执行基本操作。
-
Redisson是基于Redis的Java客户端,提供高级功能如分布式锁、分布式集合和分布式对象。
-
Redisson提供更友好的API,支持异步和响应式编程,提供内置线程安全和失败重试机制。
实现步骤:
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version></dependency>
@Configuration
public class MyRedissonConfig {@Beanpublic 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;}
信号量:典型案例车库停车等。。。。
闭锁:案例放假 锁门