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 本身已经通过分片和故障转移机制保证了高可用性。
发表回复