Redis分布式锁-觉悟吧,红锁!
【摘要】 Redis分布式锁-觉悟吧,红锁!
🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云星级博主
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈
🔥 联系方式vx:zsqtcc
每次学到知识茅塞顿开都抑制不住自己想要去分享的冲动,说来就来...
🤞Redis分布式锁红锁篇总结🤞
分布式锁,我们常见的有redis的setnx,zookeeper等,zookeeper分布式锁实战篇,都是针对一些分布式服务,分布式环境下进行进行加锁形成隔离的解决方案。
本此分享的分布式锁主要集中在redis上进行操作。
单机服务:
1️⃣. 单个机器的Redis用作分布式锁,一般来说基本够小项目使用,但是肯定redis所在的机器宕机了整个项目就废了,得等redis重启才可以使用。
多机服务:
主要包括如下三个 redis主从,哨兵模式,redis集群,哨兵模式也就是主从模式。
1️⃣. 针对redis主从模式,我们可以使用从redis做备份,当主redis宕机之后,从redis顶上接着服务,问题点:当A服务从主redis获取锁之后,主redis掉线了,但是因为还没有把A获得所得状态同步到从redis上去,这时候从redis升级为主redis,B服务又去申请了同一个分布式锁,因为并没有同步到A已经获得这把锁的状态,所以此时就有两个服务获得同一把锁,这样就会出问题了。
2️⃣. redis集群模式,也就是我们这次要说的红锁的,就解决了主从同步出现的问题,采用所有机器都是集群中的master,而没有了slave节点。
正如上边2️⃣中说那样,采用的是集群的形式而不是主从的形式,当某个服务分别向整个集群中每个实例去获取锁,如果从大于等于n/2+1个实例获取锁成功,则获取分布式所就成功。
举个🌰:
整个集群有5台机器,A服务去5个实例中去,获得了3个redis实例返回成功才代表着成功。
- 📐第 1 步:
获取当前 Unix 时间,以毫秒为单位。 - 📐第 2 步 :
依次尝试从 N 个实例,使用相同的 key 和随机值获取锁。在步骤 2,当向 Redis 设置锁时,客户端应该设置一个网络连接和响应超时时间,这个超时时间应该小于锁的失效时间。例如你的锁自动失效时间为 10 秒,则超时时间应该在 5-50 毫秒之间。这样可以避免服务器端 Redis 已经挂掉的情况下,客户端还在死死地等待响应结果。如果服务器端没有在规定时间内响应,客户端应该尽快尝试另外一个 Redis 实例。 - 📐第 3 步 :
客户端使用当前时间减去开始获取锁时间(步骤 1 记录的时间)就得到获取锁使用的时间。当且仅当从大多数(这里是 3 个节点)的 Redis 节点都取到锁,获取到3个节点之后也会继续向其他节点发送获取锁,并且使用的时间小于锁失效时间时,锁才算获取成功。 - 📐第 4 步 :
如果取到了锁,key 的真正有效时间等于有效时间减去获取锁所使用的时间(步骤 3 计算的结果,包括3个节点成功之后其他的节点的时间)。 - 📐第 5 步 :
如果锁获取失败了,不管是因为获取成功的节点的数目没有过半,还是因为获取锁的耗时超过了锁的释放时间,都会将已经设置了key的master上的key删除,这里指的是向所有redis实例发送删除,但是只有本次请求已经设置的节点上的key进行删除。这里你可能会想到如果其他业务加锁,给其他业务设置的删了不就出问题了,其实对应value中可以设计指定不同的id,这样value不同就无法删除就行。 - 📐第 6 步 :
释放锁的方法:
主动释放:
服务已经执行完,不再需要锁,但是还没有到所过期的时间,就去释放锁。
被动释放:
锁key到期了,(这个常用于获取这个锁的服务异常了)redis自动删除了,也就释放了,但是如果业务没有执行完就不好了,所以业务可以设置watchdog为分布式锁续约,增加过期时间。
以上就是自己看完之后做的一些总结,希望有所帮助,不求赞,一切随缘。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)