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

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

3天内不再提示

分布式锁的基本原理和案例实现

如意 来源:百家号 作者:小码农谈IT 2020-07-01 14:53 次阅读

前面我们有聊过乐观锁和悲观锁的实现,均是对于单体架构的场景下的实现。那么现在我们来总结看下分布式情况下如何实现锁机制。

常见场景

我们来看下一个场景,假设我现在在分布式系统下要做一个业务逻辑的消费动作,我如何保证我的消费动作只被消费一次不重复消费?有的同学第一时间就想到了MQ,诸如Zookeeper。我们今天暂不谈MQ,那其实核心还是代码执行的锁机制问题。

我们再来看一个场景,我们有个接口需要经常查数据库DB数据,如果场景允许我们经常会对其加一层缓存,并设定过期时间。假设在某一瞬间,缓存过期,但此时并发量又很大,会有大量的请求穿透去数据库请求数据,造成缓存雪崩效应。于是,我们就可以考虑加锁机制,只让一个请求去执行查询DB更新缓存的操作。

基本原理

回顾下我们之前聊到锁的原理,分布式锁也是一样的,要实现它必须满足:

互斥:任何时刻只能有一个客户端对其加锁;

避免死锁:要充分考虑某客户端在持有锁的期间崩溃,也不能导致后续其他客户端不能加锁;

谁加锁谁解锁:加锁和解锁必须是同一个客户端,否则容易出现A客户端把B客户端的锁给解了,导致锁机制失效。

示例实践

我们仅以Redis实现分布式锁为例来说明分布式锁的实现。以单机单机部署Redis的情况为例,如果有分布式Redis集群部署的情况,可以参考Redlock算法的实现。下面我们进入Redis+Lua实现分布式锁的实践。

我们来看示例代码。

加锁

分布式锁的基本原理和案例实现

注意到代码的每个细节了么?都是至关重要的。上面的set是封装过的,那我们来简单说明一下这个方法吧,该方法分别对应了上面的锁需要满足的条件。比如,NX操作保证了锁的互斥,设置过期时间避免了死锁,唯一请求ID用来标注客户端,在解锁的时候可以用来校验是不是同一个客户端自己的锁。

解锁

解锁这个动作就有趣了,看似简单却暗藏玄机,也是很重要的环节。因为解锁存在一个判断是都本客户端的锁的操作,之后才执行解锁。而这个if判断在高并发的情况下我们不得不考虑操作的原子性,这其实和PHP等其他语言代码考虑高并发的原理是大相径庭(有兴趣的看官也可以思考下,为什么有判断就要保证原子性呢,有哪些可能出现问题的场景)。那我们如果保证操作的原子性呢?第一反应是想到事务?我们这里借助Lua脚本来保证原子性,Redis的eval命令执行Lua脚本保证原子性。

我们来看下示例代码

分布式锁的基本原理和案例实现

我们同样来说明下面的解锁代码。其实很简单,就是执行了一个Lua脚本,这个脚本实现了或者当前锁的值,即唯一请求ID值,判断是否同一个客户端的请求ID,如果是,则执行Redis的del操作。

好了,关于Redis实现分布式的锁例子就到这里了,这里只是简单的示例便于理解,实际生产将需要考虑更多的场景和因素,比如集群,Zookeeper方式实现,时间和能力有限,这里就不展开赘述。

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

    关注

    0

    文章

    25

    浏览量

    8046
  • 分布式
    +关注

    关注

    1

    文章

    754

    浏览量

    74090
  • 程序互斥
    +关注

    关注

    0

    文章

    3

    浏览量

    6129
收藏 人收藏

    评论

    相关推荐

    #硬声创作季 SSG分布式视频教程:65.测试ZooKeeper分布式的基本实现

    数据库分布式MySQL
    Mr_haohao
    发布于 :2022年10月02日 23:33:05

    分布式软件系统

    降到最低。负载在各处理机之间分担,可以避免临界瓶颈。 4、当现有机构中已存在几个数据库系统,而且实现全局应用的必要性增加时,就可以由这些数据库自下而上构成分布式数据库系统。 5、相等规模的分布式
    发表于 07-22 14:53

    分布式发电技术与微型电网

    几种分布式发电简介2.分布式发电与配电网互联问题3.微型电网技术4.分布式发电(电源)技术应用的障碍和瓶颈5.分布式发电(电源)技术发展方向6.结语
    发表于 03-11 13:37

    分布式整流桥测试系统的设计与实现

    分布式整流桥测试系统的设计与实现
    发表于 08-07 00:20

    分布式声波传感系统DAS

    分布式声波传感系统DAS产品介绍1、分布式声传感(Distributed?Acoustic?Sensing,?DAS)技术: 利用相干瑞利散射光的相位而非光强来探测音频范围内的声音或振动等信号
    发表于 11-09 11:48

    分布式文件系统和fastDFS

    项目(1)(分布式文件系统、fastDFS,代码实现fastDFS 文件上传和下载)
    发表于 05-10 08:51

    在 Java 中利用 redis 实现一个分布式服务

    在 Java 中利用 redis 实现一个分布式服务
    发表于 07-05 13:14

    如何在集群部署时实现分布式session?

    集群部署时的分布式 session 如何实现
    发表于 07-17 06:57

    分布式系统的优势是什么?

    当讨论分布式系统时,我们面临许多以下这些形容词所描述的 同类型: 分布式的、删络的、并行的、并发的和分散的。分布式处理是一个相对较新的领域,所以还没有‘致的定义。与顺序计算相比、并行的、并发的和
    发表于 03-31 09:01

    HarmonyOS应用开发-分布式设计

    设计理念HarmonyOS 是面向未来全场景智慧生活方式的分布式操作系统。对消费者而言,HarmonyOS 将生活场景中的各类终端进行能力整合,形成“One Super Device”,以实现
    发表于 09-22 17:11

    鸿蒙分布式任务调度

    鸿蒙分布式任务调度,实现跨设备FA拉起
    发表于 06-12 17:28

    各种分布式电源的电气特性

    PS:渗透率的概念:从字面上理解,“渗透”就是由分布式电源发出的功率进入(渗入)到配电系统,所谓的“率”就是由分布式电源发出的电和整个系统所消耗的电(或者说总发电量)的一个比值。各种分布式电源的电气
    发表于 07-12 07:54

    如何高效完成HarmonyOS分布式应用测试?

    , getText等。② 提供远程和本地描述方式一致的分布式持测试API,仅参数不同,使用简单方便。通过UIDriver来实现。③ 分布式UI测试框架集成于IDE,开发者一键开展自动
    发表于 12-13 18:07

    分布式软总线实现近场设备间统一的分布式通信管理能力如何?

    现实中多设备间通信方式多种多样(WIFI、蓝牙等),不同的通信方式使用差异大,导致通信问题多;同时还面临设备间通信链路的融合共享和冲突无法处理等挑战。那么分布式软总线实现近场设备间统一的分布式通信管理能力如何呢?
    发表于 03-16 11:03

    分布式光纤测温的基本原理及其传感过程简介

    的光时域反射(OTDR)原理和光纤的后向拉曼散射温度效应。 二、分布式光纤测温的基本原理 分布式光纤测温系统依据后向散射原理可以分为三种:基于瑞利散射、基于拉曼散射和基于布里渊散射。目前发展比较成熟,且有产品应用于工
    发表于 10-25 10:32 76次下载