1 分布式锁的基本原理和案例实现-德赢Vwin官网 网
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方式实现,时间和能力有限,这里就不展开赘述。

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

    关注

    0

    文章

    25

    浏览量

    8074
  • 分布式
    +关注

    关注

    1

    文章

    895

    浏览量

    74498
  • 程序互斥
    +关注

    关注

    0

    文章

    3

    浏览量

    6151
收藏 人收藏

    评论

    相关推荐

    Redis 分布式的正确实现方式

    分布式一般有三种实现方式:1. 数据库乐观;2. 基于Redis的分布式;3. 基于Zoo
    的头像 发表于 05-31 14:19 3585次阅读

    Java:Redis分布式的原理和案例

    要介绍分布式,首先要提到与分布式锁相对应的是线程、进程
    的头像 发表于 07-01 11:49 3866次阅读

    为什么需要分布式 基于Zookeeper安全吗

    讲清楚。导致很多读者看了很多文章,依旧云里雾里。例如下面这些问题,你能清晰地回答上来吗? 基于 Redis 如何实现一个分布式? Redis 分布式
    的头像 发表于 08-10 18:06 5599次阅读

    Redis分布式有什么特性

    今天我们聊聊分布式。 1. 分布式是什么? 我们的手机有、车有、家门有
    的头像 发表于 10-12 16:42 2344次阅读

    分布式的设计与实现

    今天跟大家探讨一下分布式的设计与实现。希望对大家有帮助,如果有不正确的地方,欢迎指出,一起学习,一起进步哈。
    的头像 发表于 05-13 15:36 1747次阅读

    深入理解redis分布式

    深入理解redis分布式 哈喽,大家好,我是指北君。 本篇文件我们来介绍如何Redis实现分布式的演进过程,以及为什么不能直接用Setn
    的头像 发表于 10-08 14:13 945次阅读
    深入理解redis<b class='flag-5'>分布式</b><b class='flag-5'>锁</b>

    Redis实现分布式的几种方案

    本文将介绍什么是分布式,以及使用Redis实现分布式的几种方案。 前言 了解分布式
    的头像 发表于 10-11 15:19 676次阅读

    什么是分布式 Redis的五种分布式方案

    本地加锁的方式在分布式的场景下不适用,所以本文我们来探讨下如何引入分布式解决本地的问题。本篇所有代码和业务基于我的开源项目 PassJava。
    发表于 10-23 11:35 1172次阅读
    什么是<b class='flag-5'>分布式</b><b class='flag-5'>锁</b> Redis的五种<b class='flag-5'>分布式</b><b class='flag-5'>锁</b>方案

    tldb提供分布式使用方法

    前言:分布式分布式系统中一个极为重要的工具。目前有多种分布式的设计方案,比如借助 redis,mq,数据库,zookeeper 等第三
    的头像 发表于 11-02 14:44 888次阅读
    tldb提供<b class='flag-5'>分布式</b><b class='flag-5'>锁</b>使用方法

    redis分布式如何实现

    Redis分布式是一种基于Redis实现的机制,可以用于多个进程或多台服务器之间对共享资源的并发访问控制。在分布式系统中,由于多个进程或多台服务器同时访问共享资源,可能会发生数据竞争
    的头像 发表于 11-16 11:29 523次阅读

    redis分布式死锁处理方案

    引言: 随着分布式系统的广泛应用,尤其是在大规模并发操作下,对并发控制的需求越来越高。Redis分布式作为一种常见的分布式
    的头像 发表于 11-16 11:44 1741次阅读

    redis分布式的应用场景有哪些

    Redis分布式是一种基于Redis实现分布式机制,可以在分布式环境下确保资源的独占性,避
    的头像 发表于 12-04 11:21 1425次阅读

    redis分布式三个方法

    的三种常见的分布式实现方法:基于SETNX命令的简单分布式、基于SET命令的带过期时间的分布式
    的头像 发表于 12-04 11:22 1457次阅读

    如何实现Redis分布式

    机制,下面将详细介绍如何实现Redis分布式。 一、引言 在分布式系统中,多个节点可能同时读写同一共享资源。如果没有实现互斥访问和同步机制
    的头像 发表于 12-04 11:24 697次阅读

    分布式的三种实现方式

    分布式的三种实现方式  分布式是在分布式系统中用于实现
    的头像 发表于 12-28 10:01 891次阅读