分布式锁的三种实现

参考链接

文章目录

  • 分布式锁的作用
  • 分布式锁应该具有的条件
  • 实现1 基于数据库
  • 实现2 基于 Redis
  • 实现3 基于 ZooKeeper

分布式锁的作用

  • 分布式锁是一种 跨机器的互斥机制 来控制 共享资源的访问

  • 具体地,为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在单机部署的情况下,可以使用并发处理相关的功能进行互斥控制。随着业务发展,单机部署的系统演化成分布式集群系统后,由于分布式系统多线程、多进程并且 分布在不同机器上,使原单机部署情况下的并发控制锁策略失效,需要分布式锁解决此问题

分布式锁应该具有的条件

  1. 在分布式系统环境下,一个方法(资源)在同一时间只能被一个机器的一个线程执行(访问)
  2. 高可用的获取锁与释放锁
  3. 高性能的获取锁与释放锁
  4. 具备可重入特性
  5. 具备锁失效机制,防止死锁

实现1 基于数据库

  • 核心思想
    在数据库中创建一个表,表中包含方法名等字段,并在该字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁

  • 存在弊端

    1. 数据库的可用性和性能将直接影响分布式锁的可用性及性能
    2. 不具备可重入的特性,因为同一个线程在释放锁之前,行数据一直存在,无法再次成功插入数据。改进方案是在表中新增一列,用于记录当前获取到锁的机器和线程信息,在再次获取锁的时候,先查询表中机器和线程信息是否和当前机器和线程相同,若相同则直接获取锁
    3. 没有锁失效机制,有可能出现成功插入数据后,服务器宕机,对应的数据没有被删除,当服务恢复后一直获取不到锁。改进方案是在表中新增一列,用于记录失效时间,并且需要有定时任务清除这些失效的数据

实现2 基于 Redis

  • 使用命令
命令作用
setnx key valkey 不存在时插入(key, val),返回1;否则不插入,返回0
expire key timeout设置 key 的过期时间,单位为秒
delete key删除 key
  • 实现
    1. 获取锁的时候,使用 setnx 加锁,并使用 expire 命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的 value 值为一个随机生成的UUID,用于锁的释放
    2. 给获取锁的线程设置一个 获取的超时时间,若超过这个时间则放弃获取锁,防止线程持续尝试获取锁
    3. 释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放

实现3 基于 ZooKeeper

  • ZooKeeper 是一个为分布式应用提供一致性服务的开源组件,内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名

  • 实现

    1. 创建一个目录 mylock
    2. 线程A想要获取锁,在 mylock 目录下创建临时顺序节点
    3. 获取 mylock 目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁
    4. 线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点
    5. 线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁

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

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

相关文章

循环遍历多层json_面试官:JSON.stringify() 实现深拷贝有什么问题

为什么要进行深拷贝JS中的变量在内存中存储分为值类型和引用类型: 值类型: 1、占用空间固定,保存在栈中; 2、保存与复制的是值本身; 3、基本类型数据是值类型(String,Number,undefined,Boolean,Null&#x…

.NET架构小技巧(6)——什么是好的架构

首先声明,可能本篇文章的含金量配不上这个标题,因为说起架构,可能大家都比较关注高大上的架构,比如分布式的,高并发的,低耦合的,易扩展的等等,本篇可能使你失望了,因为这…

电子工程系庆贺电贺信_创造下一代光电子集成电路

全球互联网正以每年24%的复合速度增长,到2021年将达到每年3.3 zb字节。高速光通信在这个不断连接的世界中是迫切需要的,为了跟上这种增长,光模块的制造的发展是迫切需要的。复旦大学电子工程系博士研究生刘晓研究了集成构成光模块的电子电路和…

C# 中的 in 参数和性能分析

in 修饰符也是从 C# 7.2 开始引入的,它与我们上一篇中讨论的 《C# 中的只读结构体(readonly struct)》[1] 是紧密相关的。in 修饰符in 修饰符通过引用传递参数。它让形参成为实参的别名,即对形参执行的任何操作都是对实参执行的。…

禁用笔记本键盘_如何禁用/启用笔记本内置键盘?

有些小伙伴外接了USB键盘想屏蔽掉笔记本的内置键盘,绞尽脑汁都没有办法禁用,其实方法很简单只需要一个简单的命令即可。1、右键点击左下角开始图标(WinX),选择Windows Powershell(管理员)。2、在打开的窗口中,输入cmd。3、然后输入…

IdentityServer4系列 | 资源密码凭证模式

一、前言从上一篇关于客户端凭证模式中,我们通过创建一个认证授权访问服务,定义一个API和要访问它的客户端,客户端通过IdentityServer上请求访问令牌,并使用它来控制访问API。其中,我们也注意到了在4.x版本中于之前3.x…

深入探究ASP.NET Core Startup的初始化

前言Startup类相信大家都比较熟悉,在我们使用ASP.NET Core开发过程中经常用到的类,我们通常使用它进行IOC服务注册,配置中间件信息等。虽然它不是必须的,但是将这些操作统一在Startup中做处理,会在实际开发中带来许多方便。当我们…

python远程监控服务器多个日志_python压测+paramiko远程监下载日志+js测试报告

关于压测客户端netty nio压测端package com.nio.test;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.Ch…

【源码】常用的人脸识别数据库以及上篇性别识别源码

上一篇《使用ML.NET模型生成器来完成图片性别识别》发布后,很多朋友希望得到源码,这里附上地址:https://github.com/xin-lai/GenderRecognition常用的人脸数据库对于部分朋友说,找不到训练的数据,这里也给出部分数据&a…

deb包如何改支持12系统_对一个deb包的解压、修改、重新打包全过程方法

出于多种原因,有的时候需要直接对deb包中的各种文件内容进行修改主要有三个问题需要解决:0、如何将deb包文件进行解包呢?1、修改要修改的文件?2、对修改后的内容进行生成deb包?解包命令为#解压出包中的文件到extract目…

程序员过关斩将--真的可以用版本号的方式来保证MQ消费消息的幂等性?

灵魂拷问MQ消息的消费为什么有时候要求幂等性?你们都说可以用版本号来解决幂等性消费?什么才是消息幂等性消费的根本性问题?随着系统的复杂性不断增加,多数系统都会引入MQ来进行解耦,其实从引入MQ的初衷来说&#xff0…

realloc函_[转载]realloc函数的使用及注意事项(转)

原型:externvoid *realloc(void *mem_address, unsigned int newsize);用法:#include 功能:改变mem_address所指内存区域的大小为newsize长度。说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。…

InfluxDB 2.0 之Flux语法篇

由于项目 IoTSharp 需要支持 InfluxDB , 因此进行了初步尝试, 虽然 Flux 语法初次学习, 但查询语句却似曾相识, 如果改一下 标点符号, 你会完全认为他是 C#的拉姆达表达式, 首先看一下写入数据:using (var…

spring的钩子_spring提供的钩子,你知道哪些

俗话说得好“工欲善其事必先利其器”,现如今springboot与springcloud已成为快速构建web应用的利器。作为一个爪洼工程师,知道如下的spring扩展点,可能会让你编写出扩展性、维护性更高的代码。spring提供的钩子,你知道哪些bean的生…

.Net 5性能改进

起因在.Net Core跳过4.0,避免和先.Net Framework 4.0同名,版本号变为5.0,同时也不在叫.Net Core改为.Net 5(统一的叫法),先看看官方对.Net版本规划.本文主要是根据https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/ 翻译而来.不完全翻译.顺序也有所调…

ffmpeg库编译加文字_1.编译ffmpeg库

1.下载ffmpeg#!/bin/bashsource"ffmpeg-4.1"if [ ! -r $source ]thencurl http://ffmpeg.org/releases/${source}.tar.bz2 | tar xj || exit 1ficurl 表示下载,后边跟下载的地址。tar表示解压或者压缩。 x表示解压,j表示是否需要解压bz2压缩包…

C#中形态各异的class

本篇是基本知识,老码农请无视!!!普通静态抽象密封分部修饰关键字无staticabstractsealedpartial构造函数调用时机实例化(new)时内部任意静态成员调用时子类实例化(new)时实例化(new)时实例化(new)时包含成员字段属性方法事件索引器…

mysql 笛卡尔积_Mysql内连接、左连接会出现笛卡尔积的理解

先简单解释一下笛卡尔积。 现在,我们有两个集合A和B。 A = {0,1} B = {2,3,4} 集合 AB 和 BA的结果集就可以分别表示为以下这种形式: AB = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)}; BA = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)}; 以上AB和BA的结…

开放数字世界中的复杂图数据挑战 —— 以教育与开源场景为例

摘要:开源开放的数字世界开始成为时代的潮流,云原生、数据中台、智能PRA开始成为数字世界中的新一代中流砥柱。随着第四范式的普遍流行,各个行业中的数字化转型都会带了海量的具有无限关联的复杂图数据。本报告将以教育与开源两个场景为例&am…

mysql anyvalue函数_Mysql 的ANY_VALUE()函数和 ONLY_FULL_GROUP_BY 模式

Mysql 的ANY_VALUE()函数和 ONLY_FULL_GROUP_BY 模式1、ONLY_FULL_GROUP_BY 引发在mysql 5.7版本以上进行一些ORDER BY 或者 GROUP BY 时,会出现如下错误[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated colu…