Redis怎么实现分布式锁?
-
利用setnx+expire命令 (错误的做法)
-
使用Lua脚本(包含setnx和expire两条指令,但本文不涉及)
-
使用 set key value [EX seconds][PX milliseconds][NX|XX] 命令 (正确做法,本文代码案例使用此方式)
但是这样依然有问题,因为如果超时时长设置的不够长,在本次加锁后的业务操作耗时较长还未进行完毕,锁到期释放了,就会出现其他线程进行加锁操作,加锁完之后,之前的线程执行完毕,进行释放锁的操作,释放了其他线程的锁,就会出现问题,下面代码简单的使用当前线程的线程名作为value值,在解锁的时候进行比对
上代码!!!!!!
/**
* 允许丢弃,得到redis锁
*
* @param lockKey 锁定键
* @param expireInSecond 过期时间
* @return {@link String}
*/
public String getRedisLock(final String lockKey, final int expireInSecond) throws InterruptedException {
if (StringUtils.isEmpty(lockKey)) {
throw new DistributionLockException("key is empty!");
}
if (expireInSecond < 0) {
throw new DistributionLockException("expireInSecond must be bigger than 0");
}
try {
for (int i = 0; i < retryCount; i++) {
Boolean absent = redisTemplate.opsForValue().setIf