redis分布式锁
@Slf4j
@Service
public class RedisLock {
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private DefaultRedisScript<Long> redisScript;
private static final Long SUCCESS = 1L;
public boolean tryLock(String lockKey, String value, int expireTime) {
try {
return redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS);
} catch (Exception e) {
log.error("RedisLock|tryLock fail lockKey={}|value={}|expireTime={}", lockKey, value, expireTime, e);
}
return false;
}
public boolean getLock(String lockKey, String value, int expireTime, int tryTimes, long sleepMillis) {
boolean result = false;
int count = 0;
while (!result && count <= tryTimes) {
count++;
result = tryLock(lockKey, value, expireTime);
try {
TimeUnit.MILLISECONDS.sleep(sleepMillis);
} catch (InterruptedException e) {
log.error("getLock fail", e);
}
}
return result;
}
public boolean releaseLock(String lockKey, String value) {
try {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Long result = redisTemplate.execute(redisScr