/**
* 释放锁脚本,原子操作
*/
private final static DefaultRedisScript<Long> UNLOCK_LUA_SCRIPT = new DefaultRedisScript<>(
"if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return -1 end"
, Long.class
);
获取锁
public boolean lock(String key, String requestId, long expireTime) {
log.info("获取分布式锁key==>{},requestId==>{},expireTime==>{}", key, requestId, expireTime);
Boolean getLock;
int getLockTimes = 0;
try {
while (getLockTimes < get_Lock_Times) {
getLock = redisTemplate.opsForValue().setIfAbsent(key, requestId, Duration.ofMillis(expireTime));
if (null != getLock && getLock) {
return true;
}
getLockTimes++;
}
} catch (Exception e) {
log.error("获取分布式锁失败========>", e);
return false;
}
return false;
}
释放锁
public boolean unlock(String key, String requestId) {
log.info("释放分布式锁key==>{},requestId==>{}", key, requestId);
int releaseLockTimes = 0;
//释放锁
try {
while (releaseLockTimes < release_Lock_Times) {
Long result = redisTemplate.execute(UNLOCK_LUA_SCRIPT, Arrays.asList(key), requestId);
if (null != result && result == 1) {
return true;
}
releaseLockTimes++;
}
} catch (Exception e) {
log.error("释放分布式锁失败========>", e);
}
return false;
}
Comments | NOTHING