分布式锁-快速入门

在这里插入图片描述

文章目录

  • 前言
  • 一、基础概念
    • 1.1 什么是锁
    • 1.2 什么是分布式锁
    • 1.3 锁和事务的区别
  • 二、分布式锁基础理论
    • 2.1 为什么要使用分布式锁
    • 2.2 分布式锁特性
    • 2.3 分布式锁的实现方式
  • 总结

前言

  由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性、可用性和分区容错性,最多只能同时满足两项”,故此很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。
  在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。所以自己结合实际工作中的一些经验和网上看到的一些资料,做一个讲解和总结。希望这篇文章可以方便自己以后查阅,同时要是能帮助到他人那也是很好的。

一、基础概念

1.1 什么是锁

  在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量,而同步的本质是通过锁来实现的。为了实现多个线程在一个时刻同一个代码块只能有一个线程可执行,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的线程结束同步代码块取消标记后再去尝试设置标记,这个标记可以理解为锁。
  我们都知道,在业务开发中,为了保证在多线程下处理共享数据的安全性,需要保证同一时刻只有一个线程能处理共享数据。Java 给我们提供了线程锁,开放了处理锁机制的 API,比如 Synchronized、Lock 等。当一个锁被某个线程持有的时候,另一个线程尝试去获取这个锁会失败或者阻塞,直到持有锁的线程释放了该锁。在单台服务器内部,可以通过线程加锁的方式来同步,避免并发问题。如下图所示:
在这里插入图片描述

  在多线程环境下,为了保证数据的线程安全,锁保证同一时刻,只有一个可以访问和更新共享数据。在单机系统中,我们可以使用 synchronized 或者 Lock 保证线程安全。synchronized 是 Java 提供的一种内置锁,在单个 JVM 进程中提供线程之间的锁定机制,控制多线程并发,但只适用于单机环境下的并发控制。

1.2 什么是分布式锁

  分布式锁是一种在分布式系统中用于控制并发访问的机制。在分布式系统中,多个客户端同时对同一个资源进行访问时,容易出现数据不一致的问题。分布式锁的作用就是确保同一时刻只有一个客户端能够对某个资源进行访问,以避免数据不一致的问题。
  在传统单体应用单机部署的情况下,可以使用并发处理相关的功能(如ReentrantLcok或synchronized)进行互斥控制来解决。但是,随着业务的发展,系统架构也会逐步优化升级,原本单体单机部署的系统被演化成分布式集群系统,由于分布式系统多线程、多进程并且分布在多个不同机器上,这将使原单机部署情况下的并发控制锁策略无法满足,并不能提供分布式锁的能力。为了解决这个问题就需要一种跨机器的互斥机制来控制共享资源的访问,这就是分布式锁要解决的难题!
  分布式场景下解决并发问题,需要应用分布式锁技术。如上图所示,分布式锁的目的是保证在分布式部署的应用集群中,多个服务在请求同一个方法或者同一个业务操作的情况下,对应业务逻辑只能被一台机器上的一个线程执行,避免出现并发问题。如下图所示:
在这里插入图片描述

1.3 锁和事务的区别


  •   单进程的系统中,存在多线程同时操作一个公共变量,此时需要加锁对变量进行同步操作,保证多线程的操作线性执行消除并发修改。解决的是单进程中的多线程并发问题。
  • 分布式锁
      只要的应用场景是在集群模式的多个相同服务,可能会部署在不同机器上,解决进程间安全问题,防止多进程同时操作一个变量或者数据库。解决的是多进程的并发问题。
  • 事务
      解决一个会话过程中,上下文的修改对所有数据库表的操作要么全部成功,要不全部失败。所以应用在service层。解决的是一个会话中的操作的数据一致性。
  • 分布式事务
      解决一个联动操作,比如一个商品的买卖分为添加商品到购物车、修改商品库存,此时购物车服务和商品库存服务可能部署在两台电脑,这时候需要保证对两个服务的操作都全部成功或者全部回退。

二、分布式锁基础理论

2.1 为什么要使用分布式锁

  为什么需要分布式锁呢?在很久以前,用户群体不大的时候,单体应用就可以足够满足用户的所有请求,当用户增加的时候,出现了一定的并发度,可以使用简单的锁机制来协调并发的共享资源的获取。但是,随着业务的增大,用户数量的增加,为了满足业务的高效性、集群的出现,简单的锁机制已经不能够满

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

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

相关文章

python abs函数怎么用

abs()函数是Python的数字函数,用以返回数字的绝对值。 语法 以下是 abs() 方法的语法: abs( x ) 参数 x -- 数值表达式,可以是整数,浮点数,复数。 返回值 函数返回 x(数字)的绝对值&#x…

新能源汽车动力电池热管理-液冷方案应用原理与应用前景简介

前言 动力电池是新能源汽车的核心部件之一,其性能和寿命直接影响着车辆的续航里程和使用成本。液冷方案作为一种常见的动力电池温控解决方案,被广泛应用于新能源汽车领域。本文将详细介绍液冷方案的原理、发展方向以及市场前景。 一、液冷方案的原理 …

喜报 | 擎创科技荣获NIISA联盟2023年度创新技术特等奖!

为深入实施创新驱动发展战略,紧紧把握全球科技革命和产业变革方向,密切跟踪前沿科技新趋势,经科技部中国民营促进会业务主管部门批准以及国家互联网数据中心产业技术创新战略联盟(以下简称联盟)总体工作安排&#xff0…

双热点的王炸组合!损失函数+Attention,精度与速度上实现SOTA!

损失函数注意力机制在深度学习领域是一个热门研究方向,它可以提高模型的性能和泛化能力,帮助我们构建更加精确且高效的模型。 具体来说: 通过结合注意力机制的聚焦能力和损失函数的优化指导,模型能够更精确地捕捉数据中的关键信息…

PHP基于vscode医院安全不良事件管理系统源码(AEMS)前端vue2+element+后端laravel8不良事件上报与闭环管理

PHP基于vscode医院安全不良事件管理系统源码(AEMS)前端vue2element后端laravel8不良事件上报与闭环管理 医院不良事件上报与管理系统结合现代医院管理思路,遵照PDCA全面质量循环管理方法而设计,并在多家大型三甲医院成熟运用。系统…

无偏扭曲区域采样在可微分渲染中的应用

图1. 可微渲染计算光传输方程的导数。为了处理可见性的存在,最近的基于物理的可微渲染器需要显式地找到边界点[Li等人2018; Zhang等人2020],或者通过启发式方法近似边界贡献[Loubet等人2019]。我们从第一原理出发,开发了一个无偏估计器&#…

销量?模糊销量?精准销量?如何获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤: 1、确定采集目标:需要明确要采集的商品类别、筛选条件(如天猫、价格区间)、销量和金额等数据。例如,如果您想了解“小鱼零食”的销量和金额,您需要设定好价…

PyQt6--Python桌面开发(1.安装配置环境)

一.PyQt6简介 PyQt:PyQt是一个功能强大且成熟的GUI框架,基于Qt库。它提供了丰富的组件、布局和主题选项,以及强大的功能和灵活性。PyQt的优点是它具有现代化的外观和丰富的功能,适用于复杂的GUI应用程序。然而,由于Py…

今年去做视频号小店,应该怎么去做!新手快速入门的技巧!

大家好,我是电商小V 在我看来24年一定是视频号小店的分水岭,也就是说从今年开始往后视频号小店的门槛是越来越高了,现在就是越早入场的玩家来说越有利,这点是毋庸置疑的, 想要在视频号小店平台上面有长久的发展&#…

游戏技术人福音!当游戏语音碰到网易云信 ,我服了!

“开黑吗?五黑的那种” 少年时代,放假后偷偷溜进网吧,一边打着游戏,一边连麦吐槽对手的惬意岁月,不仅承载了无数 80 后、90 后,甚至 00 后的青春记忆,也让游戏语音成为了“游戏少年”闲暇生活的…

以中国为目标的DinodasRAT Linux后门攻击场景复现

概述 在上一篇《以中国为目标的DinodasRAT Linux后门剖析及通信解密尝试》文章中,笔者对DinodasRAT Linux后门的功能及通信数据包进行了简单剖析,实现了对DinodasRAT Linux后门心跳数据包的解密尝试。 虽然目前可对DinodasRAT Linux后门的通信数据包进…

github提交不了的问题

开了VPN提交的时候提示这个报错 是需要这两个端口号一致,就能提交了

大数据技术原理与技术简答

1、HDFS中名称节点的启动过程 名称节点在启动时,会将FsImage 的内容加载到内存当中,此时fsimage是上上次关机时的状态。然后执行 EditLog 文件中的各项操作,使内存中的元数据保持最新。接着创建一个新的FsImage 文件和一个空的 Editlog 文件…

WMS仓储管理系统库存分类的详细讲解

在当今日益复杂和快速变化的商业环境中,仓库管理成为了一个企业不可或缺的关键环节。WMS仓储管理系统解决方案凭借其自动化和信息化的优势,为企业带来了革命性的改变,特别是在库存分类方面。接下来,我们将深入探讨WMS仓储管理系统…

【GA】deap之个体和种群概览(一)

参考资料 1.《基于遗传算法(deap库)的一元函数寻优代码详解》 2.官方文档:http://deap.readthedocs.io/en/master/index.html 3.《 Deap: python中的遗传算法工具箱》 ,⭐️666 —————— 文章目录 壹、overview一、Types1. Fitness 适应…

用友GRP A++Cloud 政府财务云 任意文件读取漏洞复现

0x01 产品简介 用友GRP A++Cloud 政府财务云系统具有多项核心功能,旨在满足各类组织的财务管理需求。首先,它提供了财务核算功能,能够全面管理企业的总账、固定资产、现金、应付应收等模块,实时掌握企业的财务状况,并通过科目管理、凭证处理、报表分析等功能为决策提供有…

面试集中营—JVM篇

一、JVM内存模型 线程独占:栈,本地方法栈,程序计数器; 线程共享:堆,方法区 虚拟机栈:线程私有的,线程执行方法是会创建一个栈阵,用来存储局部变量表,操作栈,…

Linux提示:mount: 未知的文件系统类型“ntfs”

mount: 未知的文件系统类型“ntfs” 在Linux系统中,如果遇到“mount: 未知的文件系统类型‘ntfs’”的错误,这通常意味着您的系统没有安装支持NTFS文件系统的软件。为了挂载NTFS文件系统,您需要安装ntfs-3g软件包。以下是如何在不同Linux发行…

05-06 周一 Shell工程目录划分和开发最佳实践

05-06 周一 Shell工程目录划分和开发最佳实践 时间版本修改人描述2024年5月6日10:34:13V0.1宋全恒新建文档2024年5月6日11:07:12V1.0宋全恒完成 简介 之前楼主曾经完成过一个shell工程的开发,记得当时项目名称叫做campus-shell,主要是用来一键完成多个模…

Web Component fancy-components

css-doodle 组件库 fancy-components 组件库使用 yarn add fancy-components使用: import { FcBubbles } from fancy-components new FcBubbles() //要用哪个就new哪个 new 这里可能会报错eslink,eslintrc.js中处理报错 module.exports {rules: {no-new: off} …