redisson 红锁

redlock 初衷是为了解决单点故障问题。

超过半数的节点确认锁获取成功,才能认为锁真正生效。

Config config1 = new Config();
config1.useSingleServer().setAddress("redis://192.168.0.1:6379");
RedissonClient client1 = Redisson.create(config1);

Config config2 = new Config();
config2.useSingleServer().setAddress("redis://192.168.0.2:6379");
RedissonClient client2 = Redisson.create(config2);

Config config3 = new Config();
config3.useSingleServer().setAddress("redis://192.168.0.3:6379");
RedissonClient client3 = Redisson.create(config3);

RLock lock1 = client1.getLock("lock");
RLock lock2 = client2.getLock("lock");
RLock lock3 = client3.getLock("lock");

RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
try {
    // 尝试获取锁,最多等待 100 秒,锁有效期 30 秒
    boolean res = redLock.tryLock(100, 30, TimeUnit.SECONDS);
    if (res) {
        // 业务处理
    }
} finally {
    redLock.unlock();
}

看起来是需要全部节点都算上哦?

是否需要应用到所有 Redis 节点?

在 Redis Sentinel 中,你只需要在主节点上实现锁机制,哨兵会自动处理故障转移。

在 Redis Cluster 中,你只需要在部分主节点上实现 RedLock,而不是所有节点。因为 Redis Cluster 本身已经通过分片和故障转移机制保证了高可用性。


Comments

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注