Redis 可以通过以下方式实现分布式锁:
- 使用 SETNX 命令实现简单分布式锁:
- 当多个客户端同时对一个键执行 SETNX 操作时,只有一个客户端可以将键的值设置为1,其余客户端设置失败。
- 因此,成功设置键的值为1的客户端获取了锁,其他客户端等待该客户端释放锁后再次尝试获取锁。
例如:
Jedis jedis = new Jedis("localhost");
String lockKey = "lock";
// 获取锁
while (true) {
String lockValue = jedis.setnx(lockKey, "1");
if ("OK".equals(lockValue)) {
// 获取锁成功,执行业务逻辑
jedis.del(lockKey); // 释放锁
break;
}
}
- 使用 SETNX 和有限期锁实现可靠分布式锁:
- 利用 SETNX 获取锁,同时为锁键设置一个有限的生存时间。
- 如果锁持有客户端在锁过期前未释放锁,则锁自动释放,这避免了死锁情况的出现。
- 锁释放时,使用 DEL 命令删除锁键。
例如:
jedis.setnx(lockKey, "1"); // 获取锁
jedis.pexpire(lockKey, 10000); // 10秒过期
// 锁过期时自动释放
// 执行业务逻辑
jedis.del(lockKey); // 释放锁