【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁( 二 )


create /test laogong // 创建永久节点
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

那临时节点呢?
create -e /test laogong // 创建临时节点
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

临时节点就创建成功了 , 如果我断开这次链接 , 这个节点自然就消失了 , 这是我的一个zk管理工具 , 目录可能清晰点 。
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

如何创建顺序节点呢?
create -s /test // 创建顺序节点
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

临时顺序节点呢?
我想聪明的老公都会抢答了
create -e -s /test// 创建临时顺序节点
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

我退出后 , 重新连接 , 发现刚才创建的所有临时节点都没了 。
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

开篇演示这么多呢 , 我就是想给大家看到的zk大概的一个操作流程和数据结构 , 中间涉及的搭建以及其他的技能我就不说了 , 我们重点聊一下他在分布式锁中的实现 。
zk就是基于节点去实现各种分布式锁的 。
就拿开头的场景来说 , zk应该怎么去保证分布式情况下的线程安全呢?并发竞争他是怎么控制的呢?
为了模拟并发竞争这样一个情况 , 我写了点伪代码 , 大家可以先看看
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

我定义了一个库存inventory值为1 , 还用到了一个CountDownLatch发令枪 , 等10个线程都就绪了一起去扣减库存 。
是不是就像10台机器一起去拿到库存 , 然后扣减库存了?
所有机器一起去拿 , 发现都是1 , 那大家都认为是自己抢到了 , 都做了减一的操作 , 但是等所有人都执行完 , 再去set值的时候 , 发现其实已经超卖了 , 我打印出来给大家看看 。
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

是吧 , 这还不是超卖一个两个的问题 , 超卖7个都有 , 代码里面明明判断了库存大于0才去减的 , 怎么回事开头我说明了 。
那怎么解决这个问题?
sync , lock也只能保证你当前机器线程安全 , 这样分布式访问还是有问题 。
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

上面跟大家提到的zk的节点就可以解决这个问题 。
zk节点有个唯一的特性 , 就是我们创建过这个节点了 , 你再创建zk是会报错的 , 那我们就利用一下他的唯一性去实现一下 。
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

怎么实现呢?
上面不是10个线程嘛?
我们全部去创建 , 创建成功的第一个返回true他就可以继续下面的扣减库存操作 , 后续的节点访问就会全部报错 , 扣减失败 , 我们把它们丢一个队列去排队 。


推荐阅读