@Component
@Slf4j
public class LockHelper {
private static final String BILLING_KEY_PREFIX = ":LOCK:%s";
private final StringRedisTemplate stringRedisTemplate;
public LockHelper(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}
/**
* 释放锁lua脚本
*/
private static final String RELEASE_LOCK_LUA_SCRIPT = "if (redis.call('setnx', KEYS[1], ARGV[1]) == 1) then return redis.call('expire', KEYS[1], ARGV[2]); else return 0; end";
private static final String RELEASE_UNLOCK_LUA_SCRIPT = "if (redis.call('get', KEYS[1]) == ARGV[1]) then return redis.call('del', KEYS[1]); else return 0; end";
/**
* 尝试获取锁
*
* @param baseKey 基础id
* @return true 获取成功, false 获取失败
*/
public boolean lock(String baseKey, String lockValue, String expireTimes) {
String lockKey = String.format(BILLING_KEY_PREFIX, baseKey);
DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>(RELEASE_LOCK_LUA_SCRIPT, Boolean.class);
return Boolean.TRUE.equals(stringRedisTemplate.execute(redisScript, Collections.singletonList(lockKey), lockValue, expireTimes));
}
/**
* 解锁
*
* @param baseKey key
* @param lockValue value
*/
public boolean unlock(String baseKey, String lockValue) {
String lockKey = String.format(BILLING_KEY_PREFIX, baseKey);
DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>(RELEASE_UNLOCK_LUA_SCRIPT, Boolean.class);
return Boolean.TRUE.equals(stringRedisTemplate.execute(redisScript, Collections.singletonList(lockKey), lockValue));
}
}
[记录] redis锁
最新推荐文章于 2022-11-26 03:01:39 发布