【Java】三种方案实现 Redis 分布式锁
以下是使用Jedis实现Redis分布式锁的三种方法:
- 使用SETNX命令和EXPIRE命令
public boolean lockWithSetNxAndExpire(String lockKey, String requestId, int expireTime) {
Long result = jedis.setnx(lockKey, requestId);
if (result == 1) {
jedis.expire(lockKey, expireTime);
return true;
}
return false;
}
- 使用SET命令的EX和NX选项
public boolean lockWithSetExAndNx(String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, "NX", "EX", expireTime);
return "OK".equals(result);
}
- 使用Lua脚本
public boolean lockWithLuaScript(String lockKey, String requestId, int expireTime) {
String script = "if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then " +
"redis.call('expire', KEYS[1], ARGV[2]) return 1 else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey),
Collections.singletonList(requestId),
Collections.singletonList(String.valueOf(expireTime)));
return (Long) result == 1L;
}
以上三种方法均可实现Redis分布式锁,但第三种方法相较于其他两种在解决竞争问题上更加可靠,因为它是一个原子操作,可以防止因为客户端延迟或其他问题导致的锁无限期持有问题。
评论已关闭