加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

分布式Redis的分布式锁Redlock

发布时间:2019-06-21 17:41:35 所属栏目:编程 来源:Java开发交流
导读:弁言 之前本身在用redis来实现漫衍式锁的时辰都是基于单个Redis实例,也就是说Redis自己是有单点妨碍的,Redis的官方文档先容了一种自以为公道的算法,Redlock来实现漫衍式Redis下的漫衍式锁。 Martin Kleppmann写了一篇文章说明Redlock。然后redis的作者

 漫衍式Redis的漫衍式锁Redlock

弁言

之前本身在用redis来实现漫衍式锁的时辰都是基于单个Redis实例,也就是说Redis自己是有单点妨碍的,Redis的官方文档先容了一种"自以为"公道的算法,Redlock来实现漫衍式Redis下的漫衍式锁。

Martin Kleppmann写了一篇文章说明Redlock。然后redis的作者写了一篇辩驳的文章这里。加油。

Redlock实现库

  • Java Redisson Star 9458
  • C# RedLock.net Star 259
  • Go redsync.go Star 249

固然后头的算法是一样的,不外这个点赞数确实服。

单点Redis锁

先简朴回首一下单点的Redis锁是怎么实现的。

获取锁

  1. SET resource_name my_random_value NX PX 30000 

客户端A在Redis上配置一个特定的键值对,同时给一个超时时刻(停止死锁)。其他客户端在会见的时辰先看看这个key是否已经存在,而且值便是my_random_value。假如已存在就守候,不然就获取乐成,执行营业代码。resource_name和my_random_value是全部客户端都知道而且共享的。

开释锁

  1. if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1])else return 0end 

比拟key获取到的对应的value是否相称,假如相称,就删除(开释),不然就返回失败。

之前也写过一篇文章。

单点Redis锁的缺陷

这个缺陷着实很明明,假如只有一个Redis实例,这个挂了,全部依靠他的处事都挂了。显然不太得当大型的应用。

简朴的Redis主从架构遇到的题目

为了停止单点妨碍,我们给Redis做一个Master/Slave的主从架构,一个Master,一台Slave。下面就会遇到这么一个题目。下面是行使场景。

  1. 客户端A在Master上获取到一个锁。
  2. Master把这个数据同步到Slave的时辰挂了(由于Master和Slave之间同步是异步的)。
  3. Slave酿成了Master。
  4. 客户端B通过沟通的key,和value获取到锁。漫衍式锁失效

Redlock算法

假设我们有N(假设5)个Redis master实例,全部节点彼此独立,而且营业体系也是纯真的挪用,并没有什么其他的相同动静重发之类的帮助体系。下面来模仿一下算法:

     1.客户端获取处事器当前的的时刻t0,毫秒数。

      2.行使沟通的key和value依次向5个实例获取锁。客户端在获取锁的时辰自身配置一个远小于营业锁必要的一连时刻的超时时刻。举个例子,假设锁必要10秒,超时时刻可以配置成好比5-50毫秒。这个停止某个Redis自己已经挂了,可是客户端一向在实行获取锁的环境。超时了之后就直接跳到下一个节点。

      3.客户端通过当前时刻(t1)减去t0,计较获取锁所耗损的时刻t2(=t1-t0)。只有t2小于锁的营业有用时刻(也就是第二步的10秒),而且,客户端在至少3(5/2+1)台上获取到锁我们才以为锁获取乐成。

      4.假如锁已经获取,那么锁的营业有用时刻为10s-t2。

      5.假如客户端没有获取到锁,也许是没有在大于便是N/2+1个实例上获取锁,也也许是有用时刻(10s-t2)为负数,我们就实行去开释锁,纵然是并没有在谁人节点上获取到。

锁的开释

开释较量简朴,直接删除全部实例上对应的key就好。喜好文章的可以点个存眷哟,感激你的阅读!

【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读