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

java1234

共 951字,需浏览 2分钟

 · 2021-07-10

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

  作者 |  mushishi

来源 |  urlify.cn/Mry6bi

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 也会加锁成功, 这个时候锁的语义就被破坏了











浏览 27
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报