【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁( 二 )
create /test laogong // 创建永久节点
本文插图
那临时节点呢? create -e /test laogong // 创建临时节点
本文插图
临时节点就创建成功了 , 如果我断开这次链接 , 这个节点自然就消失了 , 这是我的一个zk管理工具 , 目录可能清晰点 。
本文插图
如何创建顺序节点呢? create -s /test // 创建顺序节点
本文插图
临时顺序节点呢?
我想聪明的老公都会抢答了 create -e -s /test// 创建临时顺序节点
本文插图
我退出后 , 重新连接 , 发现刚才创建的所有临时节点都没了 。
本文插图
本文插图
开篇演示这么多呢 , 我就是想给大家看到的zk大概的一个操作流程和数据结构 , 中间涉及的搭建以及其他的技能我就不说了 , 我们重点聊一下他在分布式锁中的实现 。
zk就是基于节点去实现各种分布式锁的 。
就拿开头的场景来说 , zk应该怎么去保证分布式情况下的线程安全呢?并发竞争他是怎么控制的呢?
为了模拟并发竞争这样一个情况 , 我写了点伪代码 , 大家可以先看看
本文插图
我定义了一个库存inventory值为1 , 还用到了一个CountDownLatch发令枪 , 等10个线程都就绪了一起去扣减库存 。
是不是就像10台机器一起去拿到库存 , 然后扣减库存了?
所有机器一起去拿 , 发现都是1 , 那大家都认为是自己抢到了 , 都做了减一的操作 , 但是等所有人都执行完 , 再去set值的时候 , 发现其实已经超卖了 , 我打印出来给大家看看 。
本文插图
是吧 , 这还不是超卖一个两个的问题 , 超卖7个都有 , 代码里面明明判断了库存大于0才去减的 , 怎么回事开头我说明了 。
那怎么解决这个问题?
sync , lock也只能保证你当前机器线程安全 , 这样分布式访问还是有问题 。
本文插图
本文插图
上面跟大家提到的zk的节点就可以解决这个问题 。
zk节点有个唯一的特性 , 就是我们创建过这个节点了 , 你再创建zk是会报错的 , 那我们就利用一下他的唯一性去实现一下 。
本文插图
本文插图
怎么实现呢?
上面不是10个线程嘛?
我们全部去创建 , 创建成功的第一个返回true他就可以继续下面的扣减库存操作 , 后续的节点访问就会全部报错 , 扣减失败 , 我们把它们丢一个队列去排队 。
推荐阅读
- 畜牧业@畜牧互联网再次引爆:阿里养猪,京东养鸡,快看大佬们都在干嘛
- 『腾讯科技』淘宝天猫蒋凡在阿里内网回应传闻:深表歉意,恳请公司展开调查
- #阿里巴巴#将饿了么卖给阿里,套现600亿的大学生,如今在干什么呢?
- 服务@云市场跨步式发展 打造ToB云市场阿里腾讯外“第三股势力”
- 『程序员』阿里程序员感慨:公司期权套牢了我,外面开五六万的薪资都不想接
- 「创作者来直播」阿里老师给检察官做直播,猜猜带的什么货?
- 『湘潭』华为、京东、阿里云……湘潭欲打造的这个“英雄联盟”很是“牛”
- #新开普#阿里系进驻后股价翻倍,这家豫股却遭大股东减持套现63次丨立方财报眼
- 【天猫】天猫“总裁夫人”手撕张大奕:如涵股价暴跌9% 阿里股价波动较小
- [马云]卸任后的马云只拥有7的股权,为何却仍可以控制阿里
