0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis分布式锁有什么特性

Linux爱好者 来源:牛牛码特 作者:牛牛码特 2021-10-12 16:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天我们聊聊分布式锁。

1. 分布式锁是什么?

我们的手机有锁、车有锁、家门有锁、贵重物品会锁进保险箱。可以说,锁在我们生活中无处不在,时刻保护着我们的人身财产安全。

在计算机领域也一样,锁可以理解为针对某项资源使用权限的管理,它通常用来控制共享资源,比如一个进程内有多个线程竞争一个数据的使用权限,解决方式之一就是加锁。

那分布式锁是什么呢?

顾名思义,分布式锁就是分布式场景下的锁,比如多台不同机器上的进程,去竞争同一项资源,就是分布式锁。

2. 分布式锁有哪些特性?

具备哪些特性的分布式锁才是一个优秀的分布式锁?我认为要从如下几方面来看:

互斥性:锁的目的是获取资源的使用权,所以只让一个竞争者持有锁,这一点要尽可能保证;

安全性:避免死锁情况发生。当一个竞争者在持有锁期间内,由于意外崩溃而导致未能主动解锁,其持有的锁也能够被正常释放,并保证后续其它竞争者也能加锁;

对称性:同一个锁,加锁和解锁必须是同一个竞争者。不能把其他竞争者持有的锁给释放了,这又称为锁的可重入性;

可靠性:需要有一定程度的异常处理能力、容灾能力。

3. 分布式锁的常用实现方式

分布式锁,一般会依托第三方组件来实现,而利用 Redis 实现则是工作中应用最多的一种。

今天,就让我们从最基础的步骤开始,依照分布式锁的特性,层层递进,步步完善,将它优化到最优,让大家完整地了解如何用 Redis 来实现一个分布式锁。

3.1 最简化版本

首先,当然是搭建一个最简单的实现方式,直接用 Redis 的 setnx 命令,这个命令的语法是:

setnx key value

如果 key 不存在,则会将 key 设置为 value,并返回 1;如果 key 存在,不会有任务影响,返回 0。

基于这个特性,我们就可以用 setnx 实现加锁的目的:通过 setnx 加锁,加锁之后其他服务无法加锁,用完之后,再通过 delete 解锁,深藏功与名。

3.2 支持过期时间

最简化版本有一个问题:如果获取锁的服务挂掉了,那么锁就一直得不到释放,就像石沉大海,杳无音信。所以,我们需要一个超时来兜底。

Redis 中有 expire 命令,用来设置一个 key 的超时时间。但是 setnx 和 expire 不具备原子性,如果 setnx 获取锁之后,服务挂掉,依旧是泥牛入海。

很自然,我们会想到,set 和 expire,有没有原子操作?

当然有,Redis早就考虑到了这种场景,推出了如下执行语句:

set key value nx ex seconds

nx 表示具备 setnx 特定,ex 表示增加了过期时间,最后一个参数就是过期时间的值。

能够支持过期时间,目前这个锁基本上是能用了。

但是存在一个问题:会存在服务 A 释放掉服务B的锁的可能。

3.3 加上owner

我们来试想一下如下场景:服务 A 获取了锁,由于业务流程比较长,或者网络延迟、 GC 卡顿等原因,导致锁过期,而业务还会继续进行。这时候,业务 B 已经拿到了锁,准备去执行,这个时候服务 A 恢复过来并做完了业务,就会释放锁,而 B 却还在继续执行。

在真实的分布式场景中,可能存在几十个竞争者,那么上述情况发生概率就很高,导致同一份资源频繁被不同竞争者同时访问,分布式锁也就失去了意义。

基于这个场景,我们可以发现,问题关键在于,竞争者可以释放其他人的锁。那么在异常情况下,就会出现问题,所以我们可以进一步给出解决方案:分布式锁需要满足谁申请谁释放原则,不能释放别人的锁,也就是说,分布式锁,是要有归属的。

3.4 引入 Lua

加入 owner 后的版本可以称得上是完善了吗?还有没有什么隐患呢?

我也不卖关子了,到这一步其实还存在一个小问题,我们完整的流程是竞争者获取锁执行任务,执行完毕后检查锁是不是自己的,最后进行释放。

流程一梳理,你们肯定明白了,执行完毕后,检查锁,再释放,这些操作不是原子化的。

可能锁获取时还是自己的,删除时却已经是别人的了。这可怎么办呢?

Redis 可没有直接提供这种场景原子化的操作啊。遇事不要慌,仔细想一想,Redis 是不是还有个特性,专门整合原子操作,对,就是它——Lua。

Redis+Lua,可以说是专门为解决原子问题而生。

有了 Lua 的特性,Redis 才真正在分布式锁、秒杀等场景,有了用武之地,下面便是改造之后的流程:

其实到了这一步,分布式锁的前三个特性:对称性、安全性、可靠性,就满足了。可以说是一个可用的分布式锁了,能满足大多数场景的需要。

4. 可靠性如何保证

分布式锁的四大特性还剩下可靠性没有解决。

针对一些异常场景,包括Redis挂掉了、业务执行时间过长、网络波动等情况,我们来一起分析如何处理。

4.1 容灾考虑

前面我们谈及的内容,基本是基于单机考虑的,如果 Redis 挂掉了,那锁就不能获取了。这个问题该如何解决呢?

一般来说,有两种方法:主从容灾和多级部署。

主从容灾

最简单的一种方式,就是为 Redis 配置从节点,当主节点挂了,用从节点顶包。

但是主从切换,需要人工参与,会提高人力成本。不过 Redis 已经有成熟的解决方案,也就是哨兵模式,可以灵活自动切换,不再需要人工介入。

通过增加从节点的方式,虽然一定程度解决了单点的容灾问题,但并不是尽善尽美的,由于同步有时延,Slave 可能会损失掉部分数据,分布式锁可能失效,这就会发生短暂的多机获取到执行权限。

有没有更可靠的办法呢?

多机部署

如果对一致性的要求高一些,可以尝试多机部署,比如 Redis 的 RedLock,大概的思路就是多个机器,通常是奇数个,达到一半以上同意加锁才算加锁成功,这样,可靠性会向 ETCD 靠近。

现在假设有 5 个 Redis 主节点,基本保证它们不会同时宕掉,获取锁和释放锁的过程中,客户端会执行以下操作:

向 5 个 Redis 申请加锁;

只要超过一半,也就是 3 个 Redis 返回成功,那么就是获取到了锁。如果超过一半失败,需要向每个 Redis 发送解锁命令;

由于向 5 个 Redis 发送请求,会有一定时耗,所以锁剩余持有时间,需要减去请求时间。这个可以作为判断依据,如果剩余时间已经为 0,那么也是获取锁失败;

使用完成之后,向 5 个 Redis 发送解锁请求。

这种模式的好处在于,如果挂了 2 台 Redis,整个集群还是可用的,给了运维更多时间来修复。

另外,多说一句,单点 Redis 的所有手段,这种多机模式都可以使用。比如为每个节点配置哨兵模式,由于加锁是一半以上同意就成功,那么如果单个节点进行了主从切换,单个节点数据的丢失,就不会让锁失效了。这样增强了可靠性。

4.2 可靠性深究

是不是有 RedLock,就一定能保证可靠的分布式锁?

这里我先说结论:由于分布式系统中的三大困境(简称 NPC),所以没有完全可靠的分布式锁!

让我们来看看 RedLock 在 NPC 下的表现。

N:Network Delay(网络延迟)

当分布式锁获得返回包的时间过长,此时可能虽然加锁成功,但是已经时过境迁,锁可能很快过期。RedLock 算了做了些考量,也就是前面所说的锁剩余持有时间,需要减去请求时间,如此一来,就可以一定程度解决网络延迟的问题。

P:Process Pause(进程暂停)

比如发生 GC,获取锁之后 GC 了,处于 GC 执行中,然后锁超时。

其他锁获取,这种情况几乎无解。这时候 GC 回来了,那么两个进程就获取到了同一个分布式锁。

也许你会说,在 GC 回来之后,可以再去查一次啊?

这里有两个问题,首先你怎么知道 GC 回来了?这个可以在做业务之前,通过时间,进行一个粗略判断,但也是很吃场景经验的;第二,如果你判断的时候是 OK 的,但是判断完 GC 了呢?这点 RedLoc k是无法解决的。

C:Clock Drift(时钟漂移)

如果竞争者 A,获得了 RedLock,在 5 台分布式机器上都加上锁。为了方便分析,我们直接假设 5 台机器都发生了时钟漂移,锁瞬间过期了。这时候竞争者 B 拿到了锁,此时 A 和 B 拿到了相同的执行权限。

根据上述的分析,可以看出,RedLock 也不能扛住 NPC 的挑战。因此,单单从分布式锁本身出发,完全可靠是不可能的。要实现一个相对可靠的分布式锁机制,还是需要和业务的配合,业务本身要幂等可重入,这样的设计可以省却很多麻烦。

5. 复盘

我们围绕互斥性、安全性、对称性层层递进,实现了一个 Redis 分布式锁,这样的架构在大多数业务场景都是完全够用的。

同时,我们也针对可靠性,探讨了主从容灾、Red Lock 等解决方案,并分析了 NPC 异常场景,了解到分布式锁在什么情况会失去作用,这些知识在实际的业务中都非常实用,能够在实际开发中做出正确的决策。

建议对分布式锁不要强依赖,没有绝对可靠的分布式锁,分布式锁需要与业务的联动配合更加切实可行,脱离了业务,就是空中楼阁,不着实地。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 分布式
    +关注

    关注

    1

    文章

    1114

    浏览量

    76696
  • Redis
    +关注

    关注

    0

    文章

    394

    浏览量

    12251

原文标题:Redis分布式锁,你用对了吗?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Redis内存管理、持久化策略与慢查询排查分析

    Redis 在生产环境中承担着缓存、会话存储、消息队列、分布式等多种角色。随着数据量增长和并发压力上升,内存碎片、持久化 I/O 抖动、慢查询堆积这三类问题会逐渐显现,直接影响服务延迟和稳定性。
    的头像 发表于 02-27 11:00 283次阅读

    分布式 IO 选型注意事项

    在工业 4.0 浪潮推动下,分布式 IO 作为工业互联的核心底层设备,已成为制造业实现设备互联、数据采集、柔性生产的关键支撑。本文将助力企业避开选型误区,最大化发挥分布式 IO 的应用价值。​ 产品
    的头像 发表于 12-30 14:14 510次阅读
    <b class='flag-5'>分布式</b> IO 选型注意事项

    零碳园区自主供能模式的分布式光伏系统

    、发电效率、投资成本、运维难度上差异显著,直接影响园区自主供能的稳定性与经济性。本文梳理零碳园区中 5 类主流分布式光伏系统,从技术特性、适用场景进行全面解析,为园区选型提供可落地的参考。
    的头像 发表于 12-20 10:21 455次阅读
    零碳园区自主供能模式的<b class='flag-5'>分布式</b>光伏系统

    国网河南地区用的分布式\分散\集中式DTU

    国网河南地区配网自动化终端分布式、分散、集中式DTU简单介绍:国网标准分散DTU由间隔单元和公共单元组成;分布式DTU由保护测控单元和综合通讯管理单元组成;集中式DTU2017版和
    的头像 发表于 11-13 15:08 1770次阅读
    国网河南地区用的<b class='flag-5'>分布式</b>\分散<b class='flag-5'>式</b>\集中式DTU

    如何解决分布式光伏计量难题?

    分布式光伏成增长主力 据《2025-2030年中国分布式光伏行业市场前景预测及未来发展趋势研究报告》显示,2024年中国分布式光伏新增装机118.18GW,同比增长23%,占光伏新增装机总量的43
    的头像 发表于 11-07 14:55 407次阅读
    如何解决<b class='flag-5'>分布式</b>光伏计量难题?

    【节能学院】Acrel-1000DP分布式光伏监控系统在奉贤平高食品 4.4MW 分布式光伏中应用

    摘要:在“双碳”和新型电力系统建设背景下,分布式光伏接入比例不断提高,对配电网电压、调度运行及调峰等环节造成强烈冲击。本文设计包含平台层、设备层二层架构体系的分布式光伏管控平台,以及小容量工商业
    的头像 发表于 08-23 08:04 3654次阅读
    【节能学院】Acrel-1000DP<b class='flag-5'>分布式</b>光伏监控系统在奉贤平高食品 4.4MW <b class='flag-5'>分布式</b>光伏中应用

    分布式光伏发电监测系统技术方案

    分布式光伏发电监测系统技术方案 柏峰【BF-GFQX】一、系统目标 :分布式光伏发电监测系统旨在通过智能化的监测手段,实现对分布式光伏电站的全方位、高精度、实时化管理。该系统能
    的头像 发表于 08-22 10:51 3462次阅读
    <b class='flag-5'>分布式</b>光伏发电监测系统技术方案

    对于当下分布式光伏发电市场前景预判

    自从531后,分布式光伏发电项目应该是相对减少了许多,但是依然还是会有,未来趋势是怎么样,是储能+自发自用余电不上网,还是什么新的政策,欢迎讨论。
    发表于 07-25 08:58

    Redis集群部署配置详解

    Redis集群是一种分布式Redis解决方案,通过数据分片和主从复制实现高可用性和横向扩展。集群将整个数据集分割成16384个哈希槽(hash slots),每个节点负责一部分槽位。
    的头像 发表于 07-17 11:04 1170次阅读

    分布式光伏总出问题?安科瑞分布式光伏监控系统来“救场”

    一、分布式光伏的痛点大揭秘 在 “双碳” 目标的大力推动下,分布式光伏作为绿色能源领域的重要力量,正以前所未有的速度蓬勃发展,越来越多的企业和家庭选择安装分布式光伏系统。然而,随着分布式
    的头像 发表于 07-16 16:50 946次阅读
    <b class='flag-5'>分布式</b>光伏总出问题?安科瑞<b class='flag-5'>分布式</b>光伏监控系统来“救场”

    分布式设备管理平台哪些功能?哪个好用?

    。 接下来,为您详细介绍几款高品质的分布式设备管理平台,企业需根据自身行业特性、设备类型、管理需求等因素综合考量,希望能带给大家一些参考。 数之能分布式设备管理平台:是一款直观易用的平台,可将 PLC、仪器仪表等各种
    的头像 发表于 07-07 17:07 934次阅读
    <b class='flag-5'>分布式</b>设备管理平台<b class='flag-5'>有</b>哪些功能?哪个好用?

    双电机分布式驱动汽车高速稳定性机电耦合控制

    摘要:为了利用所设计的双电机防滑差速驱动系统来提高分布式驱动汽车的动力学性能,在前期同轴耦合驱动控制理论研究的基础上,开展该车的高速稳定性机电耦合控制研究。建立并验证包含所设计驱动系统在内的分布式
    发表于 06-18 16:37

    曙光存储领跑中国分布式存储市场

    近日,赛迪顾问发布《中国分布式存储市场研究报告(2025)》,指出2024 年中国分布式存储市场首次超过集中式存储,规模达 198.2 亿元,增速 43.7%。
    的头像 发表于 05-19 16:50 1451次阅读

    多通道电源管理芯片在分布式能源系统中的优化策略

    摘要: 随着分布式能源系统的广泛应用,对电源管理芯片的性能要求日益提升。本文深入探讨了多通道电源管理芯片在分布式能源系统中的优化策略,以国科安芯的ASP4644芯片为例,从电气特性、工作模式、热管
    的头像 发表于 05-16 15:22 1082次阅读

    分布式光伏电力问题层出不穷?安科瑞分布式光伏运维系统来“救场”

    一、分布式光伏电力运维,痛点大揭秘​ ​ 分布式光伏作为实现绿色能源转型的关键一环,近年来在我国得到了迅猛发展。国家能源局数据显示,截至 2023 年底,中国分布式光伏电站累计并网容量约为 2.5
    的头像 发表于 05-07 17:14 1084次阅读
    <b class='flag-5'>分布式</b>光伏电力问题层出不穷?安科瑞<b class='flag-5'>分布式</b>光伏运维系统来“救场”