redis分布式锁基本原理
采用 redis 实现分布式锁,主要是利用其单线程命令执行的特性,一般是 setnx, 只会有一个线程会执行成功,也就是只有一个线程能成功获取锁; 看着很完美
看看可能有什么问题?
一般生产环境为了可用性,redis 会部署 master-slave + sentinel 的结构, 如:
master 提供服务、slave standby 作为备份节点不提供服务, master异步将数据复制给 slave 以保证数据一致, sentinel哨兵检查 master节点,当master节点故障时 将slave节点提升为 新的master 对外提供服务;
正常情况下,都是当前 master 对外提供服务,多个线程 setnx 只会有一个成功
当 master 故障时
线上环境嘛,总会有各种各样的故障出现,这也是为什么要部署 ha 的原因;
我们设想,thread-1 setnx a 1 成功后,master节点发生故障;但是,此时 a=1 这条数据还没来得及同步到 slave 节点,然后 sentinel 哨兵会进行故障切换将 slave 提升上来对外提供服务, 然后 thread-2 来 setnx a 1 加锁,因为之前锁状态在 slave 不存在,那这时候 thread-2 也会加锁成功, 这个时候锁的语义就被破坏了