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

分布式锁(Distributed Lock)介绍(基于数据库(mysql);基于缓存(redis);基于ZooKeeper等分布式协调服务)

文章目录

  • 分布式锁介绍
    • 1. 分布式锁的工作原理
      • 1.1 锁的基本概念
      • 1.2 工作机制
    • 2. 分布式锁的实现方式
      • 2.1 基于数据库的分布式锁
      • 2.2 基于Redis的分布式锁
      • 2.3 基于ZooKeeper的分布式锁
    • 3. 分布式锁的挑战
      • 3.1 死锁问题
      • 3.2 锁粒度问题
        • 粗粒度锁
        • 细粒度锁
        • 锁粒度的选择
      • 3.3 锁的公平性问题
        • 1. 使用中心化的服务
        • 2. 时间戳排序
        • 3. 队列机制
    • 4. 总结

分布式锁介绍

分布式锁是一种在分布式环境下,对共享资源提供访问限制的方法。其主要目的是防止多个进程同时操作同一资源,造成数据的不一致性。分布式锁通过在多个节点上运行的进程之间引入协调机制,来解决这个问题。

1. 分布式锁的工作原理

1.1 锁的基本概念

在开始之前,先简单了解一下锁的基本概念。锁是一种保护共享资源不被并发操作破坏的技术。当一个进程想要访问共享资源时,必须首先获取锁。如果其他进程已经持有锁,那么该进程必须等待,直到锁被释放。

1.2 工作机制

在分布式系统中,分布式锁的实现比单机环境更为复杂。因为在分布式环境下,不同的进程可能在不同的物理机器上运行。因此,我们需要一种跨越多台机器,能够实现共享状态的方式来实现分布式锁。常见的实现方式包括基于数据库、基于缓存(如Redis)或者是基于ZooKeeper等系统。

2. 分布式锁的实现方式

接下来,将详细介绍一些常见的分布式锁实现方式。

2.1 基于数据库的分布式锁

这种实现方式通常是在数据库中创建一个表,用于存储锁信息。当一个进程想要获取锁时,会在该表中插入一条记录。如果插入成功,则表示获取锁成功;如果因为主键冲突等原因插入失败,则表示获取锁失败。

CREATE TABLE `Locks` (`key` varchar(64) NOT NULL,PRIMARY KEY (`key`)
) ENGINE=InnoDB;

2.2 基于Redis的分布式锁

Redis具有很好的性能和原子操作支持,因此也常被用于实现分布式锁。通过SETNX(Set if Not eXists)命令,我们可以尝试获取一个锁。如果该锁不存在,那么设置成功,获取锁;否则获取失败。

SET resource_name my_random_value NX PX 30000

2.3 基于ZooKeeper的分布式锁

ZooKeeper是一个开源的分布式协调服务,它提供了一种高效且可靠的分布式锁实现方式。通过创建短暂的顺序ZNode节点,可以让多个客户端争抢锁。只有序号最小的客户端才能获得锁。

public void lock() {if (!tryLock()) {waitForLock(waitNode, SESSION_TIMEOUT);lock();}
}

3. 分布式锁的挑战

虽然分布式锁看起来很理想,但在实际使用中还是有许多需要注意的地方。

3.1 死锁问题

死锁是分布式锁可能会遇到的一个问题。如果持有锁的进程在释放锁之前崩溃了,那么其他所有等待获取锁的进程都将永远阻塞。为了解决这个问题,一种常见的方法是设置锁的超时时间。

3.2 锁粒度问题

锁粒度是指在数据库管理系统中,对共享资源加锁时,可以选择的最小单位。它描述了一个锁定对象所占用的数据量大小。锁粒度的大小直接影响到并发控制机制的效率。

粗粒度锁

粗粒度锁,也被称为表级锁,是一种将整个表作为一个锁定对象的策略。当一个事务需要访问某个表中的任何数据时,都需要获取该表的锁。这种策略的优点是实现简单,管理开销较小,因为即使表中有数以百万计的行,也只需要维护一个锁。但是,由于一个事务获得锁后,其他所有事务都无法访问该表,导致并发性能较差。

细粒度锁

细粒度锁,又被称为行级锁,是一种将每一行数据作为一个独立的锁定对象的策略。在这种策略下,如果一个事务需要访问某个表中的某行数据,那么只需要获取该行数据的锁即可。这样可以大大提高并发性能,因为不同的事务可以同时访问表中的不同行。然而,这种策略的缺点是,由于需要为表中的每一行都维护一个锁,因此管理开销较大。

锁粒度的选择

选择适当的锁粒度是一项重要的任务。如果选择过大的锁粒度,可能会限制并发性能;而选择过小的锁粒度,可能会增加锁管理的开销。在实际应用中,需要根据系统的具体需求和环境来选择合适的锁粒度。

3.3 锁的公平性问题

公平性指的是请求锁的顺序应该与获取锁的顺序相同。然而,在实际的分布式环境中,由于网络延迟等因素,实现公平的分布式锁并不容易。

因为网络延迟和节点之间的时间差异,可能会导致请求顺序和获取顺序不同步。但是,这并不意味着无法解决这个问题。以下是几种常见的策略:

1. 使用中心化的服务

例如ZooKeeper、etcd等提供有序的节点特性,可以按照请求顺序排队。当一个进程释放锁时,按照请求锁的顺序,将锁赋予下一个进程。这种方法可以保证公平性,但对于中心化的服务依赖性较高。

public void lock() {if (!tryLock()) {waitForLock(waitNode, SESSION_TIMEOUT);lock();}
}
2. 时间戳排序

每个锁请求都附带一个时间戳,通过比较时间戳来确定获取锁的顺序。这需要所有参与节点的时钟大致同步,否则可能会影响公平性。

def request_lock():timestamp = get_current_time()send_request_to_lock_server(lock_name, timestamp)
3. 队列机制

创建一个全局的请求队列,每次只从队头取出一个请求进行处理,确保了先进先出(FIFO)的公平性。但这种方法可能会由于单点问题导致整个系统性能瓶颈。

Queue<LockRequest> lockQueue = new LinkedList<>();public void requestLock() {LockRequest request = new LockRequest();lockQueue.add(request);
}

虽然这些策略可以提高分布式锁的公平性,但也可能会增加系统的复杂性和开销。在实际应用中,需要根据具体的需求和环境进行权衡。

4. 总结

分布式锁是一种有效的协调在分布式环境中运行的并发进程的机制。它可以帮助我们避免因并发操作而导致的数据不一致性。然而,设计和实现一个可靠、高效且公平的分布式锁是一项具有挑战性的任务。

相关文章:

分布式锁(Distributed Lock)介绍(基于数据库(mysql);基于缓存(redis);基于ZooKeeper等分布式协调服务)

文章目录 分布式锁介绍1. 分布式锁的工作原理1.1 锁的基本概念1.2 工作机制 2. 分布式锁的实现方式2.1 基于数据库的分布式锁2.2 基于Redis的分布式锁2.3 基于ZooKeeper的分布式锁 3. 分布式锁的挑战3.1 死锁问题3.2 锁粒度问题粗粒度锁细粒度锁锁粒度的选择 3.3 锁的公平性问题…...

10 ISIS 基础 报文 状态

10 ISIS 基础 报文 状态 09 ISIS 大纲-CSDN博客 •看完本篇博客,您将能知道以下内容: ▫描述IS-IS的基本概念 ▫描述IS-IS的工作原理 ▫描述IS-IS与OSPF的差异 ▫实现IS-IS的常用配置 ▫实现 ISIS 的常用到的认证...

Python第三方扩展库Matplotlib

Python第三方扩展库Matplotlib Matplotlib 是第三方库&#xff0c;不是Python安装程序自带的库&#xff0c;需要额外安装&#xff0c;它是Python的一个综合性的绘图库&#xff0c;提供了大量的绘图函数用于创建静态、动态、交互式的图形和数据可视化&#xff0c;可以帮助用户创…...

单例模式有几种写法?请谈谈你的理解?

为什么有单例模式&#xff1f; 单例模式&#xff08;Singleton&#xff09;&#xff0c;也叫单子模式&#xff0c;是一种常用的软件设计模式。在应用这个模式时&#xff0c;单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象&#xff0c;这样有利…...

帕鲁幻兽 一键开服 简单到爆 教你10秒实现 帕鲁幻兽私服联机服务器搭建

幻兽帕鲁是一款非常受欢迎的游戏&#xff0c;最近在社区中呈现了爆火的趋势&#xff0c;在线人数已经突破了百万级别。由于社区的热度不断上升&#xff0c;官方服务器开始出现了不稳定和卡人闪退的情况。搭建一个私人服务器可能是一个最稳定而舒适的解决方案。通过搭建私人服务…...

自动化报告pptx-python|如何将pandas的表格写入PPTX(二)

本篇延续:自动化报告的前奏|使用python-pptx操作PPT(一) 因为在pptx-python中使用table,需要单个cell逐一输入,于是在想有没有pandas可以直接读入的方式, 有两个开源项目有类似的功能: PandasToPowerpointmspandas其中mspandas写的比较复杂,PandasToPowerpoint比较易懂…...

Ruby详解及安装流程

文章目录 一、Ruby详解二、Ruby安装流程三、Ruby案例四、Ruby常见问题五、Ruby优缺点六、热门文章 一、Ruby详解 Ruby是一种高级编程语言&#xff0c;具有简单易学、灵活多变、优雅美丽的语法特点。它是一种面向对象的编程语言&#xff0c;具有动态类型和解释型语言的特性。在…...

免费的ChatGPT网站 ( 7个 )

ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外&#xff0c;它还能够完成多种任务&#xff0c;如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用&#xff0c;而且免费的chatGPT网站&#xff0c;AI…...

python异步编程(1)——理论篇

1.理解多线程 当启动一个Python程序时&#xff0c;它会作为一个单独的进程运行在操作系统中。进程是操作系统分配资源&#xff08;如内存和处理器时间&#xff09;的基本单位。每个Python程序启动时&#xff0c;都会创建一个主线程。如果没有在代码中明确创建其他线程&#xf…...

PyTorch复现网络模型VGG

VGG 原论文地址&#xff1a;https://arxiv.org/abs/1409.1556VGG是Visual Geometry Group&#xff08;视觉几何组&#xff09;的缩写&#xff0c;它是一个在计算机视觉领域中非常有影响力的研究团队&#xff0c;主要隶属于牛津大学的工程系和科学系。VGG以其对卷积神经网络&am…...

Springboot集成Javamelody

JavaMelody的目标是监视QA和生产环境中的Java或Java EE应用服务器。它不是模拟用户请求的工具&#xff0c;而是根据用户对应用程序的使用情况来衡量和计算应用程序实际操作的统计信息的工具。JavaMelody主要基于请求统计和演化图。 它允许改进QA和生产中的应用程序&#xff0c…...

如何将 h5 页面快速转换成微信小程序

Hello各位朋友们大家新的一月好呀&#xff01;我是咕噜铁蛋&#xff01;我知道在小程序开发中&#xff0c;有时候需要将H5页面转换成微信小程序页面。这样可以将原本的网页内容适配到小程序中&#xff0c;让用户能够更方便地访问和使用。在本文中&#xff0c;我将分享如何快速将…...

在Vue的模块开发中使用GPT的体验及总结

我这一周都在忙着实现一个页面&#xff0c;这个页面是通过vue基于element-ui来实现的。在这个过程中&#xff0c;我把页面拆分成多个组件&#xff0c;而组件的生成是通过Chat-GPT3来实现的。 这又是一次使用AI来协同开发的体验&#xff0c;觉得有必要总结一下&#xff1a; 遵循…...

Java常见算法题解析面试题(中)

11.判断101-200之间有多少个素数&#xff0c;并输出所有素数。【重点】 程序分析&#xff1a;判断素数的方法&#xff0c;用一个数分别去除2到sqrt(这个数)&#xff0c;如果能被整除&#xff0c;则表明此数不是素数&#xff0c;反之是素数。 public class lianxi { publi…...

提升网站性能的秘诀:为什么Nginx是高效服务器的代名词?

在这个信息爆炸的时代&#xff0c;每当你在浏览器中输入一个网址&#xff0c;背后都有一个强大的服务器在默默地工作。而在这些服务器中&#xff0c;有一个名字你可能听说过无数次——Nginx。今天&#xff0c;就让我们一起探索这个神奇的工具。 一、Nginx是什么 Nginx&#x…...

[Python图像处理] 使用OpenCV创建深度图

使用OpenCV创建深度图 双目视觉创建深度图相关链接双目视觉 在传统的立体视觉中,两个摄像机彼此水平移动,用于获得场景上的两个不同视图(作为立体图像),就像人类的双目视觉系统: 通过比较这两个图像,可以以视差的形式获得相对深度信息,该视差编码对应图像点的水平坐标的…...

vue+element 换肤功能

1.首先建深色和浅色两个主题样式变量样式表&#xff0c;样式表名和按钮中传入的值一样&#xff0c;本例中起名为default.scss和dark.scss 2.在data中定义主题变量名 zTheme:‘defalut’&#xff0c;默认引用defalut.scss, 在点击按钮时切换引用的样式表&#xff0c;达到换肤效果…...

python魔法函数[全面]

1、init 用于初始化对象的属性和状态 当创建一个对象时&#xff0c;Python会自动调用该对象的__init__方法。 这个方法用于初始化对象的属性和状态&#xff0c;是对象创建过程中的一个重要环节 2、new # 通常我们不需要重写__new__方法&#xff0c;除非我们正在进行一些非常…...

python实现贪吃蛇小游戏(附源码)

文章目录 导入所需的模块坐标主游戏循环模块得分 贪吃蛇小游戏&#xff0c;那个曾经陪伴着00后和90后度过无数欢笑时光的熟悉身影&#xff0c;仿佛是一把打开时光之门的钥匙。它不仅是游戏世界的经典之一&#xff0c;更是我们童年岁月中不可或缺的一部分&#xff0c;一个承载回…...

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...