③. setnx的分布式锁有哪些不足
①. 基于setnx的分布式锁有什么缺点?
线程1首先获取锁成功,将键值对写入 redis 的 master 节点
在redis将该键值对同步到slave节点之前,master 发生了故障
redis 触发故障转移,其中一个 slave 升级为新的 master
此时新的master并不包含线程1写入的键值对,因此线程2尝试获取锁也可以成功拿到锁
此时相当于有两个线程获取到了锁,可能会导致各种预期之外的情况发生,例如最常见的脏数据。
我们加的是排它独占锁,同一时间只能有一个建redis锁成功并持有锁,严禁出现2个以上的请求线程拿到锁。
②. redis之父提出了Redlock算法解决这个问题
(Redis也提供了Redlock算法,用来实现基于多个实例的分布式锁。锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。Redlock算法是实现高可靠分布式锁的一种有效解决方案,可以在实际开发中使用)
③. Redis集群的AP(redis异步复制造成的锁丢失,比如:主节点没来的及把刚刚set进来这条数据给从节点,就挂了)
④. redis分布式锁,多主集群模式,需要计算容错率(N=2X+1)
比如,网络中死了1台机器,我要求还是OK的,可以用,请问,最多主集群部署几台?
N=2*1+1=3
⑤. 为什么是奇数? N = 2X + 1 (N是最终部署机器数,X是容错机器数)
最少的机器,最多的产出效果
加入在集群环境中,redis失败1台,可接受。2N+2= 2 * 1+2 =4,部署4台
加入在集群环境中,redis失败2台,可接受。2N+2 = 2 * 2+2 =6,部署6台
⑥. 那么什么是容错呢?
失败了多少个机器实例后我还是可以容忍的,所谓的容忍就是数据一致性还是可以Ok的,CP数据一致性还是可以满足
加入在集群环境中,redis失败1台,可接受。2X+1 = 2 * 1+1 =3,部署3台,死了1个剩下2个可以正常工作,那就部署3台
加入在集群环境中,redis失败2台,可接受。2X+1 = 2 * 2+1 =5,部署5台,死了2个剩下3个可以正常工作,那就部署5台