什么是分布式锁?他解决了什么样的问题?

news2025/2/21 21:47:40

相信对于朋友们来说,锁这个东西已经非常熟悉了,在说分布式锁之前,我们来聊聊单体应用时候的本地锁,这个锁很多小伙伴都会用

✔本地锁

我们在开发单体应用的时候,为了保证多个线程并发访问公共资源的时候,期望在同一个时间只能有一个线程去访问资源,且在这个线程访问资源结束之后,其他的线程才可以访问这块资源

这个时候会使用到锁机制,一般根据不同的场景会使用到互斥锁,读写锁,自旋锁等等🧐🧐

我们还知道使用锁是会影响效率的

  • 例如如果互斥锁如果拿不到,那么会死等,这很浪费资源
  • 自旋锁如果拿不到,则会在原地自旋,一会来问一下,一会又来问一下,效率会受影响

因此还会想办法去实现原子操作,不需要加锁的情况下,保证多个线程同步

这些方式都是属于本地锁,属于在同一个进程内可以使用的锁,目的是能够控制多线程 并发 访问资源

可随着时代的发展,单体应用逐渐演变成微服务架构的时候,发现使用进程里面的本地锁已经不适用了,没有办法满足我们的需求了,因此为了解决多进程并发问题,引入了分布式锁

为什么说没法满足我们需求呢?

👀举例时刻

例1

我们有一个全局变量 sum = 0,此时的应用程序中有两个线程,分别循环 50 次,每一次循环都是对 sum 进行 +1 的操作,我们知道,这种情况,我们需要使用本地锁例如互斥锁对 sum 加锁就可以实现,程序运行完毕后, 输出的 sum 为 100 ,这个没有毛病

例2

那么如果此时场景换成有有两个应用程序,分别需要去操作第三方资源中的 sum,还是分别操作 50 次,每操作一次即对 sum 进行 +1 操作

那么这个时候,我们在每个应用中进行加锁还有意义吗?

并没有意义因为此处的 第三方资源,并不单独属于任何一个应用进程

就像例1 中, sum 全局变量的资源,并不单独属于某一个线程一样,因此,对于例2,就需要使用分布式锁了

🧐什么是分布式锁?

那么具体分布式锁到底是个啥玩意儿?🧐🧐

他自然他也是锁,只不过是用于控制多进程之间 并发

他是可以跨微服务,跨 虚拟机 的一种锁机制,上述的本地锁就完全做不到

那么还是上述的例 2,我们就这样使用分布式锁来进行处理

可以看到,使用分布式锁,和使用本地锁,其实思想都是一样的,都是为了控制程序的 并发 访问资源

都是属于君子锁,作为君子访问资源之前,先去看看能不能拿到锁,不能坏了规矩,要是坏了这个规矩,那么程序运行就会出问题

只不过本地锁是对应控制同一个进程内的多个线程并发

分布式锁是对于多个进程 并发

✔分布式锁有哪些特点呢?

  1. 互斥

既然是说,最基本的互斥功能,必须得有,不能忘本😉

  1. 锁有超时机制,可以防止死锁

对于分布式锁来说,为了避免异常未被释放,会对所加入一个超时机制

例如进程 A 加锁,但是自己忘记释放锁,或者是因为进程 A 因为异常挂掉,最终导致没有释放锁,这个时候,锁到了超时时间,自动就会释放

  1. 可重入

一个进程加了锁,这个进程仍然是可以再次获取这个锁的,例如对分布式锁不断的续期,不断的设置过期时间

可是这里如果是对于本地锁,一个线程加了锁,如果再次加锁,那么就死锁了

  1. 可以高性能的取锁和加锁
  1. 高可用

从上述我们可以看到引入的分布式锁,实际上不是进程内部的资源,可以理解为他是一个第三方的资源,是一个中间件

自然使用这些中间件中来实现所的话,一般会使用集群,集群自然会去实现自己的高可用机制,如果某些节点出现了异常,自身提供出来的机制,外部程序仍然可以使用

此处提到的中间件一般都有这些:

  • Redis
  • Etcd
  • Mysql
  • Zookeeper

每一个组件去实现分布式锁的原理和机制是不一样的,但是达到的目的是一样的, 都是为了控制多进程并发。

  1. 分布式锁需要是非阻塞的

某个进程如果获取分布式锁,发现拿不到,则会返回 false , 这个进程就会去处理自己拿不到锁的逻辑,进程不会因为没有拿到锁而阻塞

🔥总结

那么看到这里,能否回答标题的问题呢?

  • 什么是分布式锁?

他是可以跨微服务,跨 虚拟机 的一种锁机制

  • 分布式锁解决了什么问题?

他解决了在分布式系统中,访问共享资源的问题

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

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

相关文章

Apache DolphinScheduler新一代分布式工作流任务调度平台实战

总体架构 MasterServer:MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监…

Java集合框架【二容器[LinkedList容器类、Set接口]】

文章目录一 LinkedList容器类1.1 LinkedList的使用(List接口)1.2 Linked的使用(非List标准)1.4 LinkedList源码分析二 Set接口2.1 Set接口特点2.2 HashSet容器类2.2.1 Hash算法原理2.2.2 HashSet的例子2.2.3 HashSet存储特征分析2.3 TreeSet容器类2.4 通过元素自身实现比较规则…

[附源码]java毕业设计学校失物招领系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【尚硅谷】IDEA2022快速上手开发利器

【尚硅谷】IDEA2022快速上手开发利器 【尚硅谷】IDEA2022快速上手开发利器一、详细设置1.1 如何打开详细配置界面1.2 系统设置1.3 设置整体主题1.4 设置编辑器主题样式1.5 显示行号与方法分隔符1.6 代码智能提示功能1.7 自动导包配置1.8 设置项目文件编码(一定要改&…

uniapp小程序实现圆环效果

文章目录调用组件uniapp小程序利用 canvas2d实现根据指定时间动态画圆环效果调用 <view class"dubbing-control" :style"{width:recordWidth,height:recordWidth}"><dubbing-button v-if"show" :width.sync"recordWidth" :s…

e智团队实验室项目-第四周-YOLOv论文的对比实验中遇到的问题

贾小云*&#xff0c;赵雅玲 *, 张钊* , 李锦玉*&#xff0c;迟梦瑶*&#xff0c;赵尉*&#xff0c;潘玉*&#xff0c;刘立赛&#xff0c;祝大双&#xff0c;李月&#xff0c;曹海艳&#xff0c; (淮北师范大学计算机科学与技术学院&#xff0c;淮北师范大学经济与管理学院&…

2022年度国家级科技企业孵化器开始申报

科技部火炬中心关于开展2022年度国家级科技企业孵化器申报工作的通知各省、自治区、直辖市及计划单列市科技厅&#xff08;委、局&#xff09;&#xff0c;新疆生产建设兵团科技局&#xff1a; 为贯彻落实党的二十大精神&#xff0c;加快实施创新驱动发展战略&#xff0c;加快实…

MySQL操作

目录 1.对库操作 1.1 创建数据库 1.1.1 查看有哪些数据库 1.1.2 指定数据库的字符集 1.1.3 查重创建数据库 1.1.4 查看警告信息 1.1.5 小知识:SQL语句中的分号 1.1.6 小知识:设置默认字符集 1.1.7 小知识:语句中的大小写 1.2 使用/选中数据库 1.3 删除数据库(慎重操作…

PHP视频网站用wamp、phpstudy运行定制开发mysql数据库BS模式

一、源码特点 PHP视频网站是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库系统主要采用B/S模式开发,开发环境为PHP APACHE&#xff0c;数据库为mysql5.0&#xff0c;使 用php语言开发 PHP视频网站用wamp、phpstu…

21. [Python GUI] PyQt5中的模型与视图框架-抽象模型基类QAbstractItemModel与自定义模型

PyQt5中的抽象模型基类QAbstractItemModel与自定义模型 一、关于QAbstractItemModel类 QAbstractItemModel类继承自QObject&#xff0c; 该类是Qt所有模型类的基类&#xff0c;用于管理模型/视图结构中的数据。Qt的所有模型都需要子类化该类。注意&#xff0c;该类是抽象类&am…

数字孪生应用方向展示

昨晚&#xff0c;2022年卡塔尔世界杯正式打响&#xff01;伴随开幕式的进行&#xff0c;由中国铁建城建的卡塔尔世界杯主场馆卢赛尔体育场惊艳全球。事实上&#xff0c;在数字孪生技术的加持下&#xff0c;体育场馆建设也是重点技术应用方向之一&#xff0c;今天就为大家重点展…

java读取文件

先看项目截图 public class FileTest {public static void main(String[]args) throws IOException {String path Objects.requireNonNull(FileTest.class.getClassLoader().getResource("")).getPath();System.out.println(path);System.out.println("****…

微信“史诗级”更新,小而美终于回来啦~

最近微信安卓版又有了更新&#xff0c;版本号也来到了8.0.30。 此次更新又被业界称之为“史诗级”更新&#xff0c;主要原因是新版本微信安装包体积缩小了10M。 没错&#xff0c;你没有看错微信的安装包真的缩小了&#xff0c;而且整整缩小了10M&#xff01; 天呐&#xff0…

MyBatis从入门到精通真没那么难!跟着我带你深入实践Mybatis技术原理与实战!

什么是Mybatis mybatis 是一个优秀的基于java的持久层框架&#xff0c;它内部封装了jdbc&#xff0c;使开发者只需要关注sql语句本身&#xff0c;而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。 mybatis通过xml或注解的方式将要执行的各种 statemen…

跨平台应用开发进阶(四十五)uni-app集成企微客服实战

文章目录一、前言二、功能实现2.1 环境准备2.2 代码层面2.3 拓展工具三、拓展阅读一、前言 应用运营过程中&#xff0c;考虑接入企业微信客服功能&#xff0c;大致看了下官方接入文档&#xff0c;并不困难&#xff0c;引入代码量也不大。按照手册来操作即可。 二、功能实现 …

Go Module的基本使用

go module是类似于java中的maven,是包的管理工具&#xff0c;在没有这个go module之前&#xff0c;都是配置本地的GOPATH&#xff0c;创建的每个项目也都必须创建在这个GOPATH的src目录下&#xff0c;且项目的go文件不能重名 go module是在go1.1.1版本推出的 开启go module 在…

装配式施工在建筑装修中的应用研究

目 录 摘 要 I Abstract II 1引言 1 2装配式施工在建筑装修中的发展背景及现状 2 2.1装配式施工在建筑装修中的发展背景 2 2.2建筑装饰行业现状 2 3装配式施工在建筑装修中体系的主要特点 3 4装配式施工在建筑装修中体系的构成 4 4.1八大系统 4 4.1.1集成卫浴系统 4 4.1.2集成厨…

【App自动化测试】(二)Appium环境部署

目录1. Appium生态工具2. Appium环境安装部署2.1 Appium 环境依赖说明2.2 第一步&#xff1a;安装JDK2.3 第二步&#xff1a;安装SDK2.4 第三步&#xff1a;安装Appium2.5 第四步&#xff1a;安装appium python client2.6 第五步&#xff1a;安装appium-doctor检测appium的安装…

Metabase学习教程:视图-1

你应该用哪个图表&#xff1f; 您应该使用哪种类型的图表和图表来最好地传达来自数据的见解&#xff1f;这将有助于你选择正确的工作。 选择正确的图表可以归结为两个问题&#xff1a;数据是什么样子的&#xff0c;以及您试图传达什么&#xff1f; 让Metabase为您选择图表 …

Day01-网页结构分析

网页结构分析 一 前言 姓名&#xff1a;陈云 TEL&#xff1a;18571593511 企业用人的两个标准 1.能干活,见到需求能反应出粗线条实施计划,起手实施后能自主预判和解决坑点,直至完成. 2.对某些敏感点理解较准确,有一定潜质做个性化封装和技术选型工作,应对突发状况,避免生…