redis和zookeeper中怎么实现分布式锁-创新互联

redis和zookeeper中怎么实现分布式锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

10年积累的成都网站设计、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有拜泉免费网站建设让你可以放心的选择与我们合作。

 一、基于redis的分布式锁实现

1.获取锁

  redis是一种key-value形式的NOSQL数据库,常用于作服务器的缓存。从redis v2.6.12开始,set命令开始变成如下格式:

  SET key value [EX seconds] [PX milliseconds] [NX|XX]

  除key和value外,EX是超时时间,NX表示只有在key不存在的时候才会设置key的值,而XX表示在key存在的时间才会设置key的值。NX机制就是基于redis分布式锁的核心。能够解决以下问题:

  1)节点1获取key,并且设置超时时间后,还没来得及释放就挂掉了——这里EX超时时间会发挥作用,超时后自动释放锁。

  2)刚获取到锁,还没来得及设置超时时间就挂了——这里设置key和设置超时时间是原子操作,如果出现这种情况,会返回0,即获取不到锁。

 2.释放锁

  为了解决非原子操作带来的问题,常采用lua脚本实现。lua脚本的操作会被认为是原子性的,类似于事务。伪代码如下:

redis和zookeeper中怎么实现分布式锁

  二、基于zookeeper的分布式锁实现

  zookeeper是一种分布式协调服务,其中每个节点称为znode,并有自己独立的路径。 znode有四种类型:

  持久节点:默认的节点类型。创建节点的客户端与zookeeper断开连接后,该节点依旧存在 。

  持久节点顺序节点:所谓顺序节点,就是在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号:

  临时节点:和持久节点相反,当创建节点的客户端与zookeeper断开连接后,临时节点会被删除:

  临时顺序节点:结合和临时节点和顺序节点的特点:在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与zookeeper断开连接后,临时节点会被删除。

  下面看看是怎样基于上面的四类节点实现分布式锁的。

  1.获取锁

  1)在Zookeeper当中创建一个持久节,当第一个客户端Client1想要获得锁时,需要在这个节点下面创建一个临时顺序节点。

  2)Client1查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点是不是顺序最靠前的一个。如果是第一个节点,则成功获得锁。

  3)如果再有一个客户端 Client2 前来获取锁,则在持久节点下面再创建一个临时顺序节点Lock2。

  4)Client2查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点Lock2是不是顺序最靠前的一个,结果发现节点Lock2并不是最小的。

  于是,Client2向排序仅比它靠前的节点Lock1注册Watcher,用于监听Lock1节点是否存在。这意味着Client2抢锁失败,进入了等待状态。

  5)如果又有一个客户端Client3前来获取锁,则在持久节点下载再创建一个临时顺序节点Lock3。

  Client3查找持久节点下面所有的临时顺序节点并排序,判断自己所创建的节点Lock3是不是顺序最靠前的一个,结果同样发现节点Lock3并不是最小的。

  于是,Client3向排序仅比它靠前的节点Lock2注册Watcher,用于监听Lock2节点是否存在。这意味着Client3同样抢锁失败,进入了等待状态。

  2.释放锁

  释放锁就比较简单了,因为前面创建的临时顺序节点,所以在出现下面两种情况时,都会自动释放锁:

  1)任务完成后,Client会释放锁。

  2)任务没完成,Client就崩溃了,也会自动释放锁。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联-成都网站建设公司行业资讯频道,感谢您对创新互联的支持。


网页名称:redis和zookeeper中怎么实现分布式锁-创新互联
分享路径:http://scyanting.com/article/ecjjs.html