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