分布式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锁是怎么实现的。

获取锁

SET resource_name my_random_value NX PX 30000

客户端A在Redis上设置一个特定的键值对,同时给一个超时时间(避免死锁)。其他客户端在访问的时候先看看这个key是否已经存在,并且值等于my_random_value。如果已存在就等待,否则就获取成功,执行业务代码。resource_namemy_random_value是所有客户端都知道并且共享的。

释放锁

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

对比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就好。

原文地址:https://www.cnblogs.com/sheldon-lou/p/11039795.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双指针--Codeforces Round #645 (Div. 2) d题

D. The Best Vacation 题目大意&#xff1a; 算出连续x天最多的拥抱&#xff0c;一个月第i号就有i个拥抱 思路&#xff1a;双指针&#xff0c;扫描过去&#xff08;每个月每个月的计算&#xff0c;最后超出的部分再一天一天算&#xff09; 代码 &#xff1a; #include<cstd…

从CLR GC到CoreCLR GC看.NET Core对云原生的支持

内存分配概要前段时间在园子里看到有人提到了GC学习的重要性&#xff0c;很赞同他的观点。充分了解GC可以帮助我们更好的认识.NET的设计以及为何在云原生开发中.NET Core会占有更大的优势&#xff0c;这也是一个程序员成长到更高层次所需要经历的过程。在认识GC的过程中&#x…

一张图带你了解 Insider Dev Tour 2019中国技术大会

点击阅读原文&#xff0c;前往微软Insider Dev Tour 全球官网

Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4) 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给nnn个数&#xff0c;让你构造一个尽可能大的矩阵&#xff0c;其中每个点所在的行和列都不含相等元素。 思路&#xff1a; 假设构造的答案矩阵大小为ababab且a<ba<ba<b&#xff0c;那么我们可以…

.NET项目迁移到.NET Core操作指南

这篇文章&#xff0c;汇集了大量优秀作者写的关于".NET迁移到.NET Core"资料文章以及微软官方教程文档。是我在迁移公司框架项目到.NET Core和.NET Standard时遇到的问题&#xff0c;并将相关资料整理成这篇文章。记录如何一步一步把项目迁移到.NET Core。在此感谢这…

Educational Codeforces Round 88 D. Yet Another Yet Another Task(巧枚举)

cf地址 **题目大意&#xff1a;**一个序列&#xff0c;你可以选择一个子段&#xff0c;要求去掉子段最大值后的和最大&#xff0c;求出这个最大值 **思路&#xff1a;**a[i]的范围比较小&#xff0c;可以通过枚举最大值&#xff0c;再找到最大值可以辐射的区间。经典套路了。…

Codeforces Round #607 (Div. 2) E. Jeremy Bearimy dfs + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你2∗k2*k2∗k个点的一棵树。定义GGG为任选kkk组不同的点&#xff0c;每组点的距离和的最小值。定义BBB为任选kkk组不同的点&#xff0c;每组点的距离和的最大值。让你求出GGG和BBB。 思路&#xff1a; …

EF Core 3 的 40 个中断性变更

为了修复 Entify Framework Core 中许多已发现的缺陷&#xff0c;微软在 EF Core 3 中引入了 40 个中断性变更。我们可以在微软文档中查看完整的中断性变更列表&#xff0c;本文仅列举几个主要的点。客户端查询为了突破 EF Core SQL 生成器的限制&#xff0c;默认只在客户端执行…

Codeforces Round #646 (Div. 2) E(贪心,bfs)

Codeforces Round #646 (Div. 2) E 题目大意&#xff1a; 给一棵树&#xff0c;每个节点有三个权值 A,B,C, (B,C为0或1)&#xff0c;每次你可以花费 A[u] *k的代价让A子树中的任意 k 个节点交换彼此的 B &#xff0c;问让所有节点的 BC 至少花费多少代价。 思路&#xff1a; …

联手微软,Docker公司将推出Docker Desktop for WSL 2

微软最新推出的 WSL 2 在架构方面发生了重大的变化&#xff1a;它提供了一个在轻量级 VM 中运行的真正 Linux 内核。使用真正的 Linux 内核意味着可以在 Windows 上运行 ELF64 Linux 二进制文件。对 Docker 来说绝对是利好消息&#xff0c;因为这意味着 Linux 版本的 Docker 可…

Educational Codeforces Round 88 (Rated for Div. 2) E(数学)

Educational Codeforces Round 88 (Rated for Div. 2)E 题目大意: 给你n&#xff0c;k(1<k<n<5e5)&#xff0c;从1到n中选k个数组成一个严格递增序列&#xff0c;如果对任何正整数&#xff0c;依次模上这k个数&#xff0c;无论这k个数如何排列得到的答案都相同&#…

HAProxy 2.0发布,长期支持版本

HAProxy 2.0 发布了。HAProxy 是一个使用 C 语言编写的自由及开源软件&#xff0c;其提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的 Web 负载均衡解决方案。包括 GitHub、Bitbucket、Stack Overflow、R…

Codeforces Round #651 (Div. 2) D

D. Odd-Even Subsequence 题目大意&#xff1a;在a数组中 保留k个数字&#xff0c;如何代价最小的多少。 代价的算法 具体看题意&#xff1a;就是k数组中 min{max{奇数下标}&#xff0c;max{偶数下标}} 解题思路&#xff1a;贪心加二分&#xff0c;二分全部的答案&#xff08…

CF1042E Vasya and Magic Matrix 期望dp + 推公式

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 将矩阵中的数放到数组里排序&#xff0c;就是一个比较明显的期望dpdpdp了。 定义f[i]f[i]f[i]表示从第iii个出发的期望得分&#xff0c;所以转移方程也比较好写了&#xff1a;f[i]∑(f[j](…

C#并发编程之异步编程(一)

写在前面C#5.0中&#xff0c;对异步编程进行了一次革命性的重构&#xff0c;引入了async和await这两个关键字&#xff0c;使得开发人员在不需要深刻了解异步编程的底层原理&#xff0c;就可以写出十分优美而又代码量极少的代码。如果使用得当&#xff0c;你可以写出具有并行化并…

P4316 绿豆蛙的归宿 期望dp + DAG

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先要发现这是一个DAGDAGDAG图&#xff0c;让后我们可以用拓扑在图上跑期望dpdpdp。 定义f[i]f[i]f[i]表示iii到nnn的期望路径长度&#xff0c;知道终止状态f[n]0f[n]0f[n]0&#xff0c;所…

程序员修神之路--高并发下如何缩短响应时间

点击上方“蓝字”带你去看小星星菜菜哥&#xff0c;请你看电影呀&#xff0c;但是得帮我一个忙好呀&#xff0c;看什么&#xff1f;哥斯拉2&#xff1a;怪兽之王看过了~X战警&#xff1a;黑凤凰看过了追龙2和黑衣人呢&#xff1f;都看过了&#xff0c;你说帮什么忙吧我一个网站…

URAL - 1732 Ministry of Truth--kmp算法的应用(kmp模板)

题目大意&#xff1a;首先给你第一串字符串&#xff08;s1&#xff09;&#xff0c;让你删到一些字母&#xff0c;变成下面的字符串(s2)&#xff0c;删除的字母会变成字符‘_’; 思路&#xff1a;用kmp算法让s1每一个单词在s1上匹配&#xff0c;从前面开始找&#xff0c;记得匹…

从SQL Server到多数据库,微软数据库迁移全攻略

据了解&#xff0c;截止到 2022&#xff0c;云迁移市场规模将达到 1290 亿美元&#xff0c;云迁移服务市场的利润率达 26.7%。数据库作为企业迁移上云的关键环节&#xff0c;自然成为了各大云厂商关注的重点&#xff0c;除了提供各种各样的云端数据库&#xff0c;迁移服务也是云…

C#并发编程之异步编程(二)

写在前面前面一篇文章介绍了异步编程的基本内容&#xff0c;同时也简要说明了async和await的一些用法。本篇文章将对async和await这两个关键字进行深入探讨&#xff0c;研究其中的运行机制&#xff0c;实现编码效率与运行效率的提升。异步方法描述&#xff1a;使用async修饰符来…