连接html
以前本身在用redis来实现分布式锁的时候都是基于单个Redis实例,也就是说Redis自己是有单点故障的,Redis的官方文档介绍了一种"自认为"合理的算法,Redlock来实现分布式Redis下的分布式锁。github
Martin Kleppmann写了一篇文章分析Redlock。而后redis的做者写了一篇反驳的文章这里。加油。redis
虽而后面的算法是同样的,不过这个点赞数确实服。算法
先简单回顾一下单点的Redis锁是怎么实现的。bash
SET resource_name my_random_value NX PX 30000
客户端A在Redis上设置一个特定的键值对,同时给一个超时时间(避免死锁)。其余客户端在访问的时候先看看这个key是否已经存在,而且值等于my_random_value
。若是已存在就等待,不然就获取成功,执行业务代码。resource_name
和my_random_value
是全部客户端都知道而且共享的。服务器
if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end
对比key获取到的对应的value是否相等,若是相等,就删除(释放),不然就返回失败。架构
以前也写过一篇文章。dom
这个缺陷其实很明显,若是只有一个Redis实例,这个挂了,全部依赖他的服务都挂了。显然不太适合大型的应用。异步
为了不单点故障,咱们给Redis作一个Master/Slave的主从架构,一个Master,一台Slave。下面就会碰到这么一个问题。下面是使用场景。
假设咱们有N(假设5)个Redis master实例,全部节点相互独立,而且业务系统也是单纯的调用,并无什么其余的相似消息重发之类的辅助系统。下面来模拟一下算法:
释放比较简单,直接删除全部实例上对应的key就好。