当前位置: 首页 > news >正文

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

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

✔本地锁

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

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

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

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

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

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

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

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

👀举例时刻

例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 , 这个进程就会去处理自己拿不到锁的逻辑,进程不会因为没有拿到锁而阻塞

🔥总结

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

  • 什么是分布式锁?

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

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

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

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

文中提到的技术点,感兴趣的可以查看这些文章:

  • 我是如何用 redis 分布式锁来解决线上历史业务问题的
  • C 语言的 互斥锁、自旋锁、原子操作

可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

相关文章:

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

相信对于朋友们来说,锁这个东西已经非常熟悉了,在说分布式锁之前,我们来聊聊单体应用时候的本地锁,这个锁很多小伙伴都会用 ✔本地锁 我们在开发单体应用的时候,为了保证多个线程并发访问公共资源的时候,…...

Ubuntu 12.04增加右键命令:在终端中打开增加打开文件

Ubuntu 12.04增加右键命令:在终端中打开 软件中心:搜索nautilus-open-terminal安装 用快捷键CtrlT打开命令行输入: sudo apt-get install nautilus-open-terminal 重新加载文件管理器 nautilus -q 或注销再登录即要使用...

Centos 7 访问局域网windows共享文件夹

Refer: centos7 访问windows系统的共享文件夹_centos访问windows共享_三希的博客-CSDN博客 一、在CentOS中配置CIFS网络存储服务 CIFS(Common Internet File System)是一种在网络上共享文件的协议,也称为SMB(Server Message Blo…...

GDB的TUI模式(文本界面)

2023年9月22日,周五晚上 今晚在看GDB的官方文档时,发现GDB居然有文本界面模式 TUI (Debugging with GDB) (sourceware.org) GDB开启TUI的条件 GDB的文本界面的开启条件是:操作系统有适当版本的curses库 The TUI mode is supported only on…...

深入了解Python和OpenCV:图像的卡通风格化

前言 当今数字时代,图像处理和美化已经变得非常普遍。从社交媒体到个人博客,人们都渴望分享独特且引人注目的图片。本文将介绍如何使用Python编程语言和OpenCV库创建令人印象深刻的卡通风格图像。卡通风格的图像具有艺术性和创意,它们可以用…...

【算法挨揍日记】day06——1004. 最大连续1的个数 III、1658. 将 x 减到 0 的最小操作数

1004. 最大连续1的个数 III 1004. 最大连续1的个数 III 题目描述: 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 解题思路: 首先题目要我们求出的最多翻转k个0后&#x…...

华为云HECS安装docker

1、运行安装指令 yum install docker都选择y,直到安装成功 2、查看是否安装成功 运行版本查看指令,显示docker版本,证明安装成功 docker --version 或者 docker -v 3、启用并运行docker 3.1启用docker 指令 systemctl enable docker …...

力扣669 补9.16

最近大三上四天有早八,真的是受不了了啊,欧嗨呦,早上困如狗,然后,下午困如狗,然后晚上困如狗,尤其我最近在晚上7点到10点这个时间段看力扣,看得我昏昏欲睡,不自觉就睡了1…...

2023-9-22 没有上司的舞会

题目链接&#xff1a;没有上司的舞会 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 6010;int n; int happy[N]; int h[N], e[N], ne[N], idx; bool has_father[N];// 两个状态&#xff0c;选该节点或不选该…...

【HDFS】cachingStrategy的设置

org.apache.hadoop.hdfs.client.impl.BlockReaderFactory#getRemoteBlockReader: private BlockReader getRemoteBlockReader(Peer peer) throws IOException {int networkDistance = clientContext.getNetworkDistance(datanode);return BlockReaderRemote...

性能测试 —— 性能测试常见的测试指标 !

一、什么是性能测试 先看下百度百科对它的定义&#xff0c;性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环…...

【学习草稿】背包问题

一、01背包问题 图解详细解析 &#xff08;转载&#xff09; https://blog.csdn.net/qq_37767455/article/details/99086678 &#xff1a;Vi表示第 i 个物品的价值&#xff0c;Wi表示第 i 个物品的体积&#xff0c;定义V(i,j)&#xff1a;当前背包容量 j&#xff0c;前 i 个物…...

doxygen c++ 语法

c基本语法模板 以 /*! 开头, */ 结尾 /*!\关键字1\关键字2 */1 文件头部信息 /*! \file ClassA.h* \brief 文件说明 定义了类fatherA* \details This class is used to demonstrate a number of section commands.* \author John Doe* \author Jan Doe* \v…...

ChatGLM微调基于P-Tuning/LoRA/Full parameter(上)

1. 准备环境 首先必须有7个G的显存以上,torch >= 1.10 需要根据你的cuda版本 1.1 模型下载 $ git lfs install $ git clone https://huggingface.co/THUDM/chatglm-6b1.2 docker环境搭建 环境搭建 $ sudo docker pull slpcat/chatglm-6b:latest $ sudo docker run -it …...

BLE Mesh蓝牙mesh传输大数据包传输文件照片等大数据量通讯

1、BLE Mesh数据传输现状 BLE Mesh网络技术是低功耗蓝牙的一个进阶版&#xff0c;Mesh扩大了蓝牙在应用中的规模和范围&#xff0c;因为它同时支持超过三万个网络节点&#xff0c;可以跨越大型建筑物&#xff0c;不仅可以使得医疗健康应用更加方便快捷&#xff0c;还能监测像学…...

9.18 QT作业

mainwindow.h QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();signals:void jump(); //自定义跳转信号函数private slots:vo…...

【100天精通Python】Day67:Python可视化_Matplotlib 绘动画,2D、3D 动画 示例+代码

1 绘制2D动画&#xff08;animation&#xff09; Matplotlib是一个Python绘图库&#xff0c;它提供了丰富的绘图功能&#xff0c;包括绘制动画。要绘制动画&#xff0c;Matplotlib提供了FuncAnimation类&#xff0c;允许您创建基于函数的动画。下面是一个详细的Matplotlib动画示…...

Linux内核源码分析 (B.x)Linux页表的映射

Linux内核源码分析 (B.x)Linux页表的映射 文章目录 Linux内核源码分析 (B.x)Linux页表的映射一、ARM32页表1、页表术语2、虚拟地址到物理地址转换3、一级页表项4、二级页表项 二、ARM64页表1、ARMv8-A架构2、4KB大小页4级映射 三、Linux内核中关于页表的函数和宏1、查询页表2、…...

机器学习(15)---代价函数、损失函数和目标函数详解

文章目录 一、各自定义二、各自详解三、代价函数和损失函数区别四、例题理解 一、各自定义 1. 代价函数&#xff1a;代价函数&#xff08;Cost Function&#xff09;是定义在整个训练集上的&#xff0c;是所有样本误差的平均&#xff0c;也就是损失函数的平均。它用于衡量模型在…...

计算机专业大学规划之双非

​ 亲爱的计算机专业大一学弟学妹们&#xff0c;欢迎来到充满挑战和机遇的大学校园&#xff01;在经历了小半年的大学生活后&#xff0c;是否会对自己的未来感到一些迷茫&#xff0c;借着前几天给我大一的妹妹聊天的机会&#xff0c;我想发表一下关于我的建议&#xff08;仅限个…...

2.策略模式

UML图 代码 main.cpp #include "Strategy.h" #include "Context.h"void test() {Context* pContext nullptr;/* StrategyA */pContext new Context(new StrategyA());pContext->contextInterface();/* StrategyB */pContext new Context(new Strat…...

算法通过村第七关-树(递归/二叉树遍历)黄金笔记|迭代遍历

文章目录 前言1. 迭代法实现前序遍历2. 迭代法实现中序遍历3. 迭代法实现后序遍历总结 前言 提示&#xff1a;在一个信息爆炸却多半无用的世界&#xff0c;清晰的见解就成了一种力量。 --尤瓦尔赫拉利《今日简史》 你是不是觉得上一关特别简单&#xff0c;代码少&#xff0c;背…...

MySQL数据库简介+库表管理操作+数据库用户管理

Mysql Part 1 一、数据库的基本概念1.1 使用数据库的必要性1.2 数据库基本概念1.2.1 数据&#xff08;Data&#xff09;1.2.2 表1.2.3 数据库1.2.4 数据库管理系统&#xff08;DBMS&#xff09;1.2.5 数据库系统 1.3 数据库的分类1.3.1 关系数据库 SQL1.3.2 非关系数据库 NoSQL…...

PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类

目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道&#xff0c;二维卷积运算示例 单通道&#xff0c;二维&#xff0c;带偏置的卷积示例 带填充的单通道&#xff0c;二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共…...

MapRdeuce工作原理

hadoop - (三)通俗易懂地理解MapReduce的工作原理 - 个人文章 - SegmentFault 思否 MapReduce架构 MapReduce执行过程 Map和Reduce工作流程 (input) ->map-> ->combine-> ->reduce-> (output) Map&#xff1a; Reduce...

完整指南:使用JavaScript从零开始构建中国象棋游戏

引言 中国象棋&#xff0c;又被称为国际象棋&#xff0c;是一款起源于中国的古老棋类游戏。本文旨在为大家提供一个简单明了的步骤&#xff0c;教你如何使用JavaScript从零开始构建这款经典的棋类游戏。 1. 游戏简介 在中国象棋中&#xff0c;两方各有一军队&#xff0c;包括…...

PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni

一、风哥PG-DBA培训19&#xff1a;PostgreSQL高可用集群项目实战之Patroni 课程目标&#xff1a; 本课程由风哥发布的基于PostgreSQL数据库的系列课程&#xff0c;本课程属于PostgreSQL主从复制与高可用集群阶段之PostgreSQL高可用集群项目实战之Patroni&#xff0c;学完本课…...

数据库管理-第105期 安装Database Valut组件(20230919)

数据库管理-第105期 安装Database Valut组件&#xff08;20230919&#xff09; 之前无论是是EXPDP还是PDB中遇到的一些问题&#xff0c;其实都跟数据库的DV&#xff08;Database Valut&#xff09;组件有关&#xff0c;因为目标库没有安装DV导致启动时会出现问题。 1 DV/OLS …...

企望制造ERP系统RCE漏洞 复现

文章目录 企望制造ERP系统RCE漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 企望制造ERP系统RCE漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播…...

【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用

文章目录 前言PlayerPrefs一、基本介绍二、Demo三、优缺点 JsonUtility一、基本使用二、Demo三、优缺点 Mysql&#xff08;扩展&#xff09;完结 前言 游戏存档不言而喻&#xff0c;是游戏设计中的重要元素&#xff0c;可以提高游戏的可玩性&#xff0c;为玩家提供更多的自由和…...

自己可以申请网站做外卖吗/国际新闻界官网

http://www.python3.vip/tut/auto/selenium/02/ 根据 class属性 选择元素 这个网址对应的html内容 有如下的部分 被测地址 http://cdn1.python3.vip/files/selenium/sample1.html <body><div class"plant"><span>土豆</span></div>&…...

下载网站的表格要钱如何做/企业网站制作哪家好

各种算法学习集合 https://github.com/youngyangyang04/leetcode-master 方法介绍 前缀树、字典树 https://blog.csdn.net/weixin_39778570/article/details/81990417 // 侧面有好多的算法集合 https://baike.baidu.com/item/%E5%AD%97%E5%85%B8%E6%A0%91/9825209?fro…...

wordpress媒体库插件/网站外链分析工具

本科生毕业论文 基于Python校园网站系统&#xff08;Django框架&#xff09; 开题报告 学 院&#xff1a; 专 业&#xff1a; 计算机科学与技术 年 级&#xff1a; 学生姓名&#xff1a; …...

8月4号建设部网站/下载百度app

您所在位置&#xff1a;网站首页 > 海量文档&nbsp>&nbsp计算机&nbsp>&nbspJava如何利用Java实现QQ文件传输功能.pdf2页本文档一共被下载&#xff1a;次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性&#xff0c;…...

iis7 wordpress 伪静态规则/seo排名优化资源

练习题2.1 一、选择题 1.函数导数是函数改变量与自变量改变量之比&#xff0c;当( D )趋于零时的极限. A.自变量;B.函数;C.函数的改变量;D.自变量改变量 解&#xff1a;依据导数定义&#xff1a;f ′ (x 0 )lim Δx→0 ΔyΔx ,可知选D \color{blue}{解:\\ 依据导数定义…...

公司网络维护外包价格/防控措施持续优化

上面的这个图片实际上结构已经非常清楚。服务器端和Android移动端通过一个Broker来完成通信。在这里仅仅把完成这个实验的过程中遇到的问题记录下来。即在个人PC上配置一个本地的服务器环境&#xff0c;与Android端进行通讯。准备工作&#xff1a;1.首先需要下载Tokudu在github…...