ZooKeeper实现分布式锁

一、分布式锁的概念

我们有三个系统,系统A是由Java开发的,系统B是由PHP开发的,系统C是由.net开发的。锁共享的资源是什么了,就是我们所说的数据库当中的某张表,这张表出现了最终数据的不一致的问题。

以下订单为例,假设当前有10个库存,一次请求下订单(6个)的时候创建订单后去扣除库存速度变慢了,那么下一个请求过来的时候去查询库存就发现库存还是10个,然后也会去执行创建订单和扣除库存这么一个操作,最终两个请求都成功了,库存变为-2,和实际生活不一致,这个时候就需要引入分布式锁。

二、分布式锁方案

第一种:数据库中构建一张表,利用表种的字段值1或者0来判断该操作是否可执行

第二种:利用Redis的setnx key value,设置有效期

第三种:利用Zk的临时节点,countdownlacth原子工具类,上锁和解锁

单机:Redis效率更高,基本内存

分布式:偏爱ZK,Redis的数据同步机制实时性相比zk要低很多

三、Zooker实现分布式锁的原理步骤

第一步:首先在根路径下面创建好ZK命名空间

第二步:在该命名空间下创建好其中一个锁的节点(永久)imooc-locks,称之为分布式锁的总节点

第三步:对上述锁节点(即真正要监听节点的父节点进行监控)创建监听事件(addWatcherToLock)

监听子节点是否已被移除,如果是的话,则触发同步计数器(countdownlatch)的自减操作,当countdownlacth的值为0的时候,前面阻塞的线程就可以继续往下执行了,即分布式的请求可以执行了。

释放锁操作:就是删除字节点

代码中使用:

1.执行订单流程之前当前业务获得分布式锁

distributedLock.getLock();

2.在一个业务流程可能结束的时间将这把锁给释放

//释放锁,让下一个请求获得锁
distributedLock.releaseLock();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值