基于Zookeeper实现分布式锁以及源码的示例分析分析

这篇文章给大家介绍基于Zookeeper实现分布式锁以及源码的示例分析分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

关于Redis实现分布式锁 分布式环境下利用Redis实现分布式锁,今天我带领大家熟悉用zookeeper实现分布式锁。

在学习分布式锁之前,让我们想一想,在什么业务场景下会用到分布式锁以及设计分布式锁要注意什么?

分布式锁介绍

1、在什么业务场景中会使用到分布式锁

当多个客户端访问服务器上同一个资源的时候,需要保证数据的一致性,比如秒杀系统,举个栗子:

某件商品在系统中的数量是5件,当秒杀时间到来,会有大量的用户抢购这件商品,瞬间会产生非常大的并发。正常的购买流程是:

step1、用户下单

step2、判断商品数量是否足够

step3、如果足够,库存--

step4、如果库存不够,秒杀失败。

假设此时商品只剩余一件,用户A对商品下单,商品数足够,下单成功,系统还没有来得及减库存,用户B也对同一件商品下单,此时商品数仍为1,最后导致系统会库存减两次,导致商品超卖现象。此时就需要对用户下单-->减库存的这一步操作进行加锁,使操作成为原子操作。在单机、单进程环境下,使用JDK的ReentrantLcok或者synchronized完全足够,但由于秒杀系统并发量极大,单机承受不了这样的压力极易宕机,此时就需要多台服务器、多进程支撑起这个业务,单机下的ReentrantLcok或者synchronized在此处毫无用武之地,此时就需要一把分布式锁来保证某个时间段只有一个用户访问共享资源。

2、分布式锁的注意事项

a、高效的获取锁和释放锁

b、在网络不稳定、中断、宕机情况下要自动释放锁,防止自锁

c、有阻塞锁的特性,即使没有获取锁,也会阻塞等待

d、具备非阻塞锁特性,即没有获取到锁,则直接返回获取锁失败

e、具备可重入行,同一线程可多次获得锁

zookeeper实现分布式锁

对于zookeeper,在此就不多介绍,我们可以利用zk的顺序临时节点这一特性来实现分布式锁。思路如下:

1、获取锁时,在zk的目录下创建一个节点,判断该节点的需要在其兄弟节点中是否是最小的,若是最小的,则获取锁成功。

2、若不是最小的,则锁已被占用,需要对比自己小的节点注册监听器,如果锁释放,监听到释放锁事件,判断此时节点在其兄弟节点是不是最小的,如果是,获取锁。

关于基于Zookeeper实现分布式锁以及源码的示例分析分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。