拾遗补漏——再谈分布式锁
在集群环境下,直接使用指令加锁是不安全的。当主节点挂掉后,从节点开始取而代之,当第一个客户端在主节点成功申请一把锁,但这把锁还没同步到从节点,这样系统同样一把锁被两个客户端持久。
不过这种不安全也仅在主从发生failover的情况下才产生,而且持续时间极短,业务系统大多情况可以容忍
Readlock算法
加锁时,它会向过半节点发送set(key,value,nx=True,ex=xxx)指令,只要过半set成功,就认为加锁成功。释放锁时,需要向所有节点发送del指令。不过Redlock算法还需要考虑出错重试、时钟漂移等很多细节问题,同时因为Redlock需要向多个节点进行读写,性能会下降一些
Redlock使用场景
如果很在乎高可用性,希望即使挂了一台Redis也完全不受影响,就应该考虑Redlock。不过代价也是有的,需要更多的Redis实例,性能也下降了,代码上还需要引入额外的library,运维也要特殊对待,都是需要考虑的成本