redisson分布式锁解决的问题
1.多个服务之间同一时间只能有一个服务执行业务方法
2.锁与线程的通讯,例如执行业务的时间比锁设置的失效时间还要长,redis就要判断是否需要延长锁失效时间
导入jar
这里使用maven导入
<!-- 引入redisson-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.2</version>
</dependency>
创建锁
这里锁有两种常规锁与公平锁
1.常规锁
//创建锁
RLock lock = redissonClient.getLock(lockName);
2.公平锁
//创建公平锁 根据请求的时间去分配下一个获取锁的对象
RLock lock = redissonClient.getFairLock(lockName);
加锁
void lock();
//加锁1 此方法没有返回值,加锁成功就会继续执行下面的代码,
//如果这个锁已经存在,他就会一直阻塞,直到锁的时间失效(默认30秒),
//这个方法是保证一定能抢到锁的
lock.lock();
void lock(long var1, TimeUnit var3);
//加锁2 设置锁的时间和单位
lock.lock(5, TimeUnit.SECONDS);
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
//加锁3 (第一个参数是等待锁的最长时间)表示尝试去加锁,如果加锁成功就返回true执行接下来的代码,但是redis如果已经有了这个锁他会进行等待,还拿不到锁就会返回false,执行false的代码块
//为了将实现waitTime,使用了redis的订阅发布功能。也就是没有抢到锁的线程订阅消息,直至waitTime过期返回false或者被通知新一轮的开始抢占,如果他抢占到锁,锁的过期时间也是30秒,
boolean isLock = lock.tryLock(5, TimeUnit.SECONDS);
if (!isLock){
log.info("加锁失败");
return;
}
boolean tryLock(long var1, long var3, TimeUnit var5) throws InterruptedException;
//加锁4 (第一个参数为等待锁的最长时间)(第二个参数是表示锁的失效时间)
boolean isLock = lock.tryLock(5,5, TimeUnit.SECONDS);
if (!isLock){
log.info("加锁失败");
return;
}
删除锁
void unlock();
//此方法必须放在finally里面,防止业务代码报错而不释放锁
lock.unlock();