Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >分布式Redis的分布式锁 Redlock

分布式Redis的分布式锁 Redlock

作者头像
_淡定_
发布于 2019-06-19 02:23:20
发布于 2019-06-19 02:23:20
70800
代码可运行
举报
文章被收录于专栏:dotnet & javadotnet & java
运行总次数:0
代码可运行

链接 Distributed locks with Redis

引言

之前自己在用redis来实现分布式锁的时候都是基于单个Redis实例,也就是说Redis本身是有单点故障的,Redis的官方文档介绍了一种"自认为"合理的算法,Redlock来实现分布式Redis下的分布式锁。

Martin Kleppmann写了一篇文章分析Redlock。然后redis的作者写了一篇反驳的文章这里。加油。

Redlock实现库

虽然后面的算法是一样的,不过这个点赞数确实服。

单点Redis锁

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

获取锁
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET resource_name my_random_value NX PX 30000

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

释放锁
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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就好。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-06-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis的分布式锁要注意哪些安全性问题?
我们的解决方案是:在加锁时为锁设置过期时间,当过期时间到达,Redis 会自动删除对应的 Key-Value,从而避免死锁。需要注意的是,这个过期时间需要结合具体业务综合评估设置,以保证锁的持有者能够在过期时间之内执行完相关操作并释放锁。
码农架构
2021/03/21
3840
Redis的分布式锁要注意哪些安全性问题?
Redis分布式锁
我比较喜欢做全套的,一个Redis分布式锁的应用示例,我准备了Redis各种环境、SpringBoot部署两个服务、用tengine做这两个服务的负载均衡、用Jmeter做压力测试,可谓是麻雀虽小,五脏俱全。
行百里er
2020/12/02
8400
Redis分布式锁
聊聊分布式锁
高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。
微观技术
2020/08/20
3840
百度社招面试题——如何用Redis实现分布式锁
关于Redis实现分布式锁的问题,网络上很多,但是很多人的讨论基本就是把原来博主的贴过来,甚至很多面试官也是一知半解经不起推敲就来面候选人,最近结合我自己的学习和资料查阅,整理一下用Redis实现分布式锁的方法,欢迎评论、交流、讨论。
Leetcode名企之路
2019/05/06
5760
百度社招面试题——如何用Redis实现分布式锁
Redis 分布式锁的正确实现方式
之前我们使用的定时任务都是只部署在了单台机器上,为了解决单点的问题,为了保证一个任务,只被一台机器执行,就需要考虑锁的问题,于是就花时间研究了这个问题。到底怎样实现一个分布式锁呢?
用户2060079
2018/10/11
1.1K0
Redis分布式锁的10个坑
日常开发中,经常会碰到秒杀抢购等业务。为了避免并发请求造成的库存超卖等问题,我们一般会用到Redis分布式锁。但是使用Redis分布式锁,很容易踩坑哦~ 本文田螺哥将给大家分析阐述,Redis分布式锁的10个坑~
捡田螺的小男孩
2022/12/29
1.4K0
Redis分布式锁的10个坑
用Redis构建分布式锁-RedLock(真分布)「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说用Redis构建分布式锁-RedLock(真分布)「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/02/10
4700
用Redis构建分布式锁-RedLock(真分布)「建议收藏」
Redis实现分布式锁Redis分布式锁安全和活性失效保障为什么基于故障转移的实现还不够Redis分布式锁防死锁单Redis实例实现分布式锁的正确方法Redlock算法这个算法是异步的么?失败时重试释
所用代码地址 https://github.com/Wasabi1234/mmall Redis分布式锁 分布式锁在很多场景中是非常有用的原语, 不同的进程必须以独占资源的方式实现资源共享就是一个典型的例子。 有很多分布式锁的库和描述怎么实现分布式锁管理器(DLM)的博客,但是每个库的实现方式都不太一样,很多库的实现方式为了简单降低了可靠性,而有的使用了稍微复杂的设计。 一种算法,叫Redlock,我们认为这种实现比普通的单实例实现更安全 安全和活性失效保障 按照思路和设计方案,算法只需具备3个特性就可以
JavaEdge
2018/05/16
1.4K0
技术分享 | Redis 之分布式锁
分布式锁指的就是分布式系统下使用的锁(说了好像等于没说),在分布式系统中,常常需要协调组件间的动作。
爱可生开源社区
2023/01/05
6.8K0
七种方案!探讨Redis分布式锁的正确使用姿势
日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出哈,一起学习一起进步。
捡田螺的小男孩
2021/03/15
1.3K0
大厂都聊分布式系统,面试不知道分布式锁如何聊下去
公众号[JavaQ]原创,专注分享Java基础原理分析、实战技术、微服务架构、分布式系统构建,诚邀点赞关注!
JavaQ
2020/04/26
7260
[Redis] 分布式缓存中间件 Redis 之 分布式锁实战
环境准备Redis 如何实现分布式锁线程不安全单机锁分布式锁代码实现Redisson 集成和源码分析Redisson 集成源码分析 `RedissonLock`加锁解锁集群分布式锁失效判断机制总结REFERENCES更多
架构探险之道
2020/03/19
8350
[Redis] 分布式缓存中间件 Redis 之 分布式锁实战
基于zookeeper或redis实现分布式锁
在分布式系统中,分布式锁是为了解决多实例之间的同步问题。例如master选举,能够获取分布式锁的就是master,获取失败的就是slave。又或者能够获取锁的实例能够完成特定的操作。
用户2937493
2019/09/11
5670
基于zookeeper或redis实现分布式锁
一文彻底弄清楚分布式锁
关于实现强一致性的手段,可以使用多种方式来进行实现,有分布式事务,有一致性算法,还有分布式锁等等,那么这篇文章我们就围绕分布式锁这个话题来进行展开,首先,我们会先探究它的原理,然后结合实际应用,对目前较为常见的分布式锁实现方式及注意事项进行详细的分析。
用户7353950
2022/06/23
4000
一文彻底弄清楚分布式锁
Redis分布式锁服务(八)
概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源。比如: object obj = new object(); lock (obj) { //操作共享资源 } 利用操作系统提供的锁机制,可以确保多线程或多进程下的并发唯一操作。但如果在多机环境下就不能满足了,当A,B两台机器同时操作C机器的共享资源时,就需要第三方的锁机制来保证在分布式环境下的资源协调,也称分布式锁。 Redis有三个最基本属性来保证分布式锁的有效实现: 安全性: 互斥,在任何时候,只有一个客户端能持有锁。 活跃性
蘑菇先生
2018/05/21
8020
面试官:你真的了解Redis分布式锁吗?
说到Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis因为单进程、性能高的特点,它还经常被用于做分布式锁。
鄙人薛某
2021/01/15
8300
面试官:你真的了解Redis分布式锁吗?
【大厂面试题】Redis中是如何实现分布式锁的?
可以直接通过 set key value px milliseconds nx 命令实现加锁, 通过Lua脚本实现解锁。
民工哥
2020/09/15
4.1K0
【大厂面试题】Redis中是如何实现分布式锁的?
Redis 分布式锁没这么简单,网上大多数都有 bug
Redis 分布式锁这个话题似乎烂大街了,不管你是面试还是工作,随处可见,「码哥」为啥还写?
码哥字节
2021/11/16
1.2K0
分布式锁那点事
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。本篇将详细分析分布式锁的三种实现方式及其优化方案,分析其优缺点。 为什么要使用分布式锁 为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,为
JavaQ
2018/04/08
9320
Redlock(redis分布式锁)原理分析
Redlock:全名叫做 Redis Distributed Lock;即使用redis实现的分布式锁;
JAVA葵花宝典
2019/05/24
8K1
推荐阅读
相关推荐
Redis的分布式锁要注意哪些安全性问题?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档