基于Redis的分布式锁
利用Redis的原子操作特性实现分布式锁,具有高性能、实现简单的优点。
// 获取锁 SETNX + 过期时间
public boolean lock(String lockKey, String requestId, int expireTime) {
// 使用SETNX命令尝试获取锁
// SET key value NX PX milliseconds
String result = jedis.set(lockKey, requestId, SetParams.setParams().nx().px(expireTime));
return "OK".equals(result);
}
// 释放锁 Lua脚本保证原子性
public boolean unlock(String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then "
+ "return redis.call('del', KEYS[1]) "
+ "else return 0 end";
Object result = jedis.eval(script,
Collections.singletonList(lockKey),
Collections.singletonList(requestId));
return Long.valueOf(1L).equals(result);
}