Author:赵志乾
Date:2020-07-28
Declaration:All Right Reserved!!!
踩坑:
场景:获取Redis锁,完成业务逻辑后释放锁
做法:try语句中获取Redis锁,finally语句中释放锁,代码如下:
try{
// step1: 获取锁--默认过期时间15秒
boolean result = jedisTemplate.getLock(lockKey);
if(!result){
// 抢锁失败
return;
}
// step2: 业务逻辑
}catch(Exception ex){
// step3: 异常处理逻辑
}finally{
// step4: 释放锁
jedisTemplate.releaseLock(lockKey);
}
解决方案:
上述问题在于释放锁之前未加判定。如果未获取锁,会导致锁被提前释放;对于锁的释放要依据锁的获取位置进行处理。解决方案有以下两种:
方案1: try语句之外获取锁,成功获取锁之后才可进入try语句
// step1: 获取锁--默认过期时间15秒
boolean result = jedisTemplate.getLock(lockKey);
if(!result){
// 抢锁失败
return;
}
try{
// step2: 业务逻辑
}catch(Exception ex){
// step3: 异常处理逻辑
}finally{
// step4: 释放锁
jedisTemplate.releaseLock(lockKey);
}
方案2: try语句内获取锁,释放前判定是否已获得锁
boolean result = false;
try{
// step1: 获取锁--默认过期时间15秒
result = jedisTemplate.getLock(lockKey);
if(!result){
// 抢锁失败
return;
}
// step2: 业务逻辑
}catch(Exception ex){
// step3: 异常处理逻辑
}finally{
// step4: 释放锁
if(result){
jedisTemplate.releaseLock(lockKey);
}
}