redis实现分布式锁天然的缺陷

作者 | mushishi
来源 | urlify.cn/Mry6bi
redis分布式锁基本原理采用 redis 实现分布式锁 , 主要是利用其单线程命令执行的特性 , 一般是 setnx ,  只会有一个线程会执行成功 , 也就是只有一个线程能成功获取锁;看着很完美
看看可能有什么问题?一般生产环境为了可用性 , redis 会部署 master-slave + sentinel 的结构 ,  如:

redis实现分布式锁天然的缺陷

文章插图
 
master 提供服务、slave standby 作为备份节点不提供服务 ,  master异步将数据复制给 slave 以保证数据一致 ,  sentinel哨兵检查 master节点 , 当master节点故障时 将slave节点提升为 新的master 对外提供服务;
正常情况下 , 都是当前 master 对外提供服务 , 多个线程 setnx 只会有一个成功
redis实现分布式锁天然的缺陷

文章插图
 
当 master 故障时线上环境嘛 , 总会有各种各样的故障出现 , 这也是为什么要部署 ha 的原因;
我们设想 , thread-1 setnx a 1 成功后 , master节点发生故障;但是 , 此时 a=1 这条数据还没来得及同步到 slave 节点 , 然后 sentinel 哨兵会进行故障切换将 slave 提升上来对外提供服务 ,  然后 thread-2 来 setnx a 1 加锁 , 因为之前锁状态在 slave 不存在 , 那这时候 thread-2 也会加锁成功 ,  这个时候锁的语义就被破坏了
redis实现分布式锁天然的缺陷

文章插图
 
 

【redis实现分布式锁天然的缺陷】


    推荐阅读