可靠性
首先,想要保证分布式锁可以使用,下面这四个条件是必须要满足的:
- 互斥性。在任意时刻,只有一个客户端能持有锁。
- 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
- 具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。
- 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。
加锁、解锁代码
public void sync(String lockKey) {
boolean check = false;
try {
check = redisTemplate.opsForValue().setIfAbsent(lockKey, true);
if(check){
log.info("处理业务……");
}
} catch (Exception exception) {
log.error(ToolsUtil.getStackMessage(exception));
} finally {
if(check){
redisTemplate.delete(lockKey);
}
}
}
第一步,设置一个变量check,标记加锁标识。
第二步,我们尝试用lockKey作为Redis的Key进行上锁动作,因为Key是唯一的,如果返回true则加锁成功,如果返回false则代表加锁失败。
第三步,判断变量check是否为true,如果为true代表lockKey被上锁并且是我们自己上锁,进行业务操作。
第四步,判断变量check是否为true,如果为true代表lockKey被上锁并且是我们自己上锁,则进行解锁。