Redisson master-slave issue
我们在使用Redisson的分布式锁时,可能会遇到master-slave的问题。
在Redis中,master-slave是一个主从关系。其中master进行写操作,slave进行读操作。
在master节点宕机时,slave节点无法跟上master的速度,这会导致数据不一致的问题。
为了解决这个问题,我们可以将全部的Redis节点都设置为master节点。
Redisson multiLock
现在所有的Redis节点都是master节点。
我们应该获取所有节点的锁,然后我们可以使用这些锁,如果没有,我们就不能使用这些锁。
这个解决方案保证了所有的锁都有相同的数据,并且锁在同一个集群中,这保持了数据一致性。
如果我们想要高可用性,我们可以为master节点设置slave节点。
这样,如果master节点宕机,slave节点将接管master节点并保持数据一致性。
虽然其他线程想要锁定slave节点,但它们将无法获得锁,因为它们需要获取所有节点的锁。(multiLock)
Redis 分布式锁的几个种类
- 不可重入的 Redis 分布式锁
- 原理: 利用 setnx 的互斥性;利用 ex 避免死锁; 释放锁时判断线程标识
- 缺陷: 不可重入、无法重试、锁超时失效
- 可重入的 Redis 分布式锁
- 原理: 利用 hash 结构,记录线程标识和重入次数;利用 watchDog 延续锁时间; 利用信号量控制锁重试等待
- 缺陷: redis 宕机引起的锁失效
- Redisson 的 multiLock
- 原理: 多个独立的 Redis 节点, 必须在所有节点都获取重入锁,才算获取成功
- 缺陷: 运维成本高,实现复杂