标签:分布 @param disco div red 过期 let command ice
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 获取分布式锁 - 过期时间
* @param key
* @param expireTime 毫秒
* @return
*/
public Object getExpiredLock(String key, Long expireTime) {
Long value = System.currentTimeMillis() + expireTime;
return redisTemplate.execute((RedisCallback) connection -> {
int count = 3;
while (count > 0) {
try {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
return commands.set(key, String.valueOf(value), "NX", "PX", expireTime);
} catch (Exception e) {
logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
count--;
}
}
return null;
});
}
/**
* 获取分布式锁 - 过期时间,value
* @param key
* @param expireTime
* @return
*/
public Object getExpiredLock(String key, Long expireTime, String value) {
return redisTemplate.execute((RedisCallback) connection -> {
int count = 3;
while (count > 0) {
try {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
return commands.set(key, value, "NX", "PX", expireTime);
} catch (Exception e) {
logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
count--;
}
}
return null;
});
}
/**
* 获取分布式锁value
* @param key
* @return
*/
public Object getValue4ExpiredLock(String key) {
return redisTemplate.execute((RedisCallback) connection -> {
int count = 3;
while (count > 0) {
try {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
return commands.get(key);
} catch (Exception e) {
logger.error("getExpiredLock exception key={}, count={}:", key, count, e);
count--;
}
}
return null;
});
}
/**
* 删除任务队列锁
* @param lockKey
*/
public void deleteLock(String lockKey) {
int count = 3;
while (count > 0) {
try {
if (redisTemplate.hasKey(lockKey) && Long.valueOf(""+getValue4ExpiredLock(lockKey)) > System.currentTimeMillis()) {
// 当前时间比该锁对应的value小,说明未过期,并占有该锁,可以直接删除
redisTemplate.delete(lockKey);
logger.info("删除list锁:{}", lockKey);
} else {
logger.info("任务锁已过期, taskListLockKey={}", lockKey);
}
break;
} catch (Exception e) {
logger.error("deleteLock count={}", count, e);
count--;
}
}
}
// 获取分布式锁
if (redisService.getExpiredLock(key, 5000L) == null) {
return;
}
// 删除分布式锁
redisService.deleteLock(key);
标签:分布 @param disco div red 过期 let command ice
原文地址:https://www.cnblogs.com/wanhua-wu/p/11929297.html