redis 做分布式锁的代码实现
时间: 2023-09-01 08:11:37 浏览: 90
redis分布式锁源代码最新版.rar
5星 · 资源好评率100%
好的,以下是 Redis 实现分布式锁的代码示例:
```
// 获取锁
boolean lock(String lockKey, String requestID, int expireTime, int retryTimes, long retryInterval) {
boolean result = false;
while (retryTimes > 0) {
String status = jedis.set(lockKey, requestID, "NX", "PX", expireTime);
if ("OK".equals(status)) {
result = true;
break;
}
retryTimes--;
try {
Thread.sleep(retryInterval);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
return result;
}
// 释放锁
boolean unlock(String lockKey, String requestID) {
// 使用 Lua 脚本确保解锁是原子操作
String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(luaScript, Collections.singletonList(lockKey), Collections.singletonList(requestID));
return "1".equals(result);
}
```
该代码示例使用了 Redis 的 set 命令来获取锁,其中参数 "NX" 表示只有在锁不存在时才会进行设置操作;参数 "PX" 表示锁的过期时间,单位为毫秒。
为了避免锁的过期时间过短而导致的锁失效,可以在获取锁失败时进行重试。在 lock 方法中,retryTimes 表示重试次数,retryInterval 表示每次重试的时间间隔。
在释放锁时,该示例使用了 Lua 脚本确保解锁是原子操作,避免由于网络延迟等原因导致的解锁不一致问题。
阅读全文