@Slf4j
@Component
public class RedisLockUtil {
@Autowired
private RedisTemplate redisTemplate;
@Value("${lock.enabled:false}")
private Boolean enableLock;
private static final long DEFUAL_EXPIRE_TIME_S = 10L;
private static final long DEFUAL_ROLL_TIME_S = 5L;
public Boolean lock(String key){
return lock(key,DEFUAL_ROLL_TIME_S);
}
public Boolean lock(String key, Long timeOut){
if(!enableLock){
log.info("enableLock = {}", enableLock);
return Boolean.TRUE;
}
long begin = System.nanoTime();
Boolean result = (Boolean) redisTemplate.execute((RedisCallback) action -> {
do {
Boolean r = action.setNX(key.getBytes(), key.getBytes());
if (r) {
r = action.expire(key.getBytes(), RedisLockUtil.DEFUAL_EXPIRE_TIME_S);
log.info("get lock by key = {} result = {}", key, r);
return r;
} else {
log.info("get lock by key = {} fail", key);
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
log.error("lock error", e);
}
} while (TimeUnit.NANOSECONDS.toSeconds(System.nanoTime()-begin) < timeOut);
return Boolean.FALSE;
});
return result;
}
public void unLock(String key) {
if(!enableLock){
log.info("enableLock = {}", enableLock);
return ;
}
redisTemplate.delete(key);
log.info("lock unLock key = {}", key);
}
}
本文由博客一文多发平台 OpenWrite 发布!