美文网首页
分布式锁redis和zk的使用和比较

分布式锁redis和zk的使用和比较

作者: 华木公子 | 来源:发表于2019-08-08 19:42 被阅读0次

    一 基于redis的分布式锁

    setnx 方式设置值;从而加锁;

    • 解锁时,为了保证原子性(查询锁,判断值并删除),需要在redis服务端用脚本来实现查询并删除;
    • 缺点是:如果master和slave结构,如果存在脑裂或者数据丢失情况,导致锁的数据没有同步,就导致了分布式锁的失效。

    补救方案是官方推荐的redlock方案:

    给每个master都尽量上锁,上锁数量是(总节点数/2+1),就认为上锁成功,比如5个节点就要3个都上锁才算成功。
    获取锁时,当在3个(超过半数)redis上请求到锁的时候,才算是真正获取到了锁。如果没有获取到锁,则把部分已锁的redis释放掉。

    二 基于zk的分布式锁

    1. 临时节点方式

    上锁就是添加临时节点,解锁就是临时节点删除;
    其他线程上锁,发现添加临时节点失败,就添加一个zk节点监听器并阻塞当前线程。当节点被删除时,触发监听器,于是当前线程会继续尝试加锁,如果添加临时节点成功,则加锁成功,如果添加失败,则说明竞争锁失败,只能继续添加节点监听器,重复循环。

    1. 临时顺序节点方式

    需要加锁的线程都依次在zk上添加临时顺序节点,zk会按照顺序从小到大依次选取节点,所被选取到的节点,即认为是获取锁的线程。(可以监听顺序比自己小1的节点,只要前一个节点删除了,就触发监听,监听内部就可以实现判断当前节点是不是最小节点,是的话就等同于获取到锁)

    三 redis和zk的分布式锁的比较

    1. redis 需要轮询,而zk是主动通知,因此zk效率更高;
    2. redis 创建锁的客户端如果挂了,只能等待超时后解锁;而zk在客户端挂了后就会自动释放锁;
    3. redis 需要做值判断,写脚本等,而且redlock也会存在多节点数据问题,比较麻烦;zk的语义简单明了。

    综上,zk更适合做分布式锁。

    相关文章

      网友评论

          本文标题:分布式锁redis和zk的使用和比较

          本文链接:https://www.haomeiwen.com/subject/todfjctx.html