redis分布式锁实现

来源:互联网 发布:人工智能图片大全 编辑:程序博客网 时间:2024/06/07 20:18
public synchronized boolean getLock2(final String lockKeyPrefix, final String lockKeySuffix) {
int retryTimes = 5; //重试次数
while (true) {
boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
RedisSerializer<String> redisSerializer = redisTemplate.getStringSerializer();
byte[] key = redisSerializer.serialize(lockKeyPrefix);
final String expireTime = String.valueOf(System.currentTimeMillis() + Long.valueOf(CreditAccountCode.DATA_LOCK_EXPIRE_MILLIS.getCode())) + "_" + lockKeySuffix;
byte[] value = redisSerializer.serialize(expireTime);
return redisConnection.setNX(key, value);
}
});
if (result) {
return true;
} else {
String lockValue = (String) redisTemplate.opsForValue().get(lockKeyPrefix);
Long oldExpireTime = Long.valueOf(lockValue.split("_")[0]);
Long currentTime = System.currentTimeMillis();
if (oldExpireTime < currentTime) { //已经超时
Long newExpireTime = currentTime + Long.valueOf(CreditAccountCode.DATA_LOCK_EXPIRE_MILLIS.getCode());
String preLockValue = (String) redisTemplate.opsForValue().getAndSet(lockKeyPrefix, String.valueOf(newExpireTime) + "_" + lockKeySuffix);
Long currentExpireTime = Long.valueOf(preLockValue.split("_")[0]);
if (currentExpireTime.equals(oldExpireTime)) {
return true;
} else {
try {
if (retryTimes > 0) {
Thread.sleep(300); //等待300毫秒重试
retryTimes--;
// System.out.println("-------------------------------" + retryTimes);
continue;
} else {
return false;
}
} catch (InterruptedException e) {
logger.error(e.getMessage());
return false;
}
}

} else {
try {
if (retryTimes > 0) {
Thread.sleep(300); //等待300毫秒重试
retryTimes--;
// System.out.println("-------------------------------" + retryTimes);
continue;
} else {
return false;
}
} catch (InterruptedException e) {
logger.error(e.getMessage());
return false;
}
}

}
}
}

public synchronized void delLock2(String lockKeyPrefix, String lockKeySuffix) {
Long currentTime = System.currentTimeMillis();
String expireTimeString = (String) redisTemplate.opsForValue().get(lockKeyPrefix);
if (expireTimeString != null) {
Long expirTime = Long.valueOf(expireTimeString.split("_")[0]);
if (currentTime < expirTime && lockKeySuffix.equals(expireTimeString.split("_")[1])) {
redisTemplate.delete(lockKeyPrefix);
}
}
}
原创粉丝点击