Redis中如何实现分布式锁?

Redis 可以通过以下方式实现分布式锁:

  1. 使用 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;
  }
} 
  1. 使用 SETNX 和有限期锁实现可靠分布式锁:
  • 利用 SETNX 获取锁,同时为锁键设置一个有限的生存时间。
  • 如果锁持有客户端在锁过期前未释放锁,则锁自动释放,这避免了死锁情况的出现。
  • 锁释放时,使用 DEL 命令删除锁键。
    例如:
jedis.setnx(lockKey, "1");   // 获取锁
jedis.pexpire(lockKey, 10000); // 10秒过期

// 锁过期时自动释放
// 执行业务逻辑
jedis.del(lockKey);    // 释放锁