赞
踩
我们有三个系统,系统A是由Java开发的,系统B是由PHP开发的,系统C是由.net开发的。锁共享的资源是什么了,就是我们所说的数据库当中的某张表,这张表出现了最终数据的不一致的问题。
以下订单为例,假设当前有10个库存,一次请求下订单(6个)的时候创建订单后去扣除库存速度变慢了,那么下一个请求过来的时候去查询库存就发现库存还是10个,然后也会去执行创建订单和扣除库存这么一个操作,最终两个请求都成功了,库存变为-2,和实际生活不一致,这个时候就需要引入分布式锁。
第一种:数据库中构建一张表,利用表种的字段值1或者0来判断该操作是否可执行
第二种:利用Redis的setnx key value,设置有效期
第三种:利用Zk的临时节点,countdownlacth原子工具类,上锁和解锁
单机:Redis效率更高,基本内存
分布式:偏爱ZK,Redis的数据同步机制实时性相比zk要低很多
第一步:首先在根路径下面创建好ZK命名空间
第二步:在该命名空间下创建好其中一个锁的节点(永久)imooc-locks,称之为分布式锁的总节点
第三步:对上述锁节点(即真正要监听节点的父节点进行监控)创建监听事件(addWatcherToLock)
监听子节点是否已被移除,如果是的话,则触发同步计数器(countdownlatch)的自减操作,当countdownlacth的值为0的时候,前面阻塞的线程就可以继续往下执行了,即分布式的请求可以执行了。
释放锁操作:就是删除字节点
代码中使用:
1.执行订单流程之前当前业务获得分布式锁
distributedLock.getLock();
2.在一个业务流程可能结束的时间将这把锁给释放
//释放锁,让下一个请求获得锁
distributedLock.releaseLock();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。