分布式锁(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 是第三方库,不是Python安装程序自带的库,需要额外安装,它是Python的一个综合性的绘图库,提供了大量的绘图函数用于创建静态、动态、交互式的图形和数据可视化,可以帮助用户创…...

单例模式有几种写法?请谈谈你的理解?
为什么有单例模式? 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利…...

帕鲁幻兽 一键开服 简单到爆 教你10秒实现 帕鲁幻兽私服联机服务器搭建
幻兽帕鲁是一款非常受欢迎的游戏,最近在社区中呈现了爆火的趋势,在线人数已经突破了百万级别。由于社区的热度不断上升,官方服务器开始出现了不稳定和卡人闪退的情况。搭建一个私人服务器可能是一个最稳定而舒适的解决方案。通过搭建私人服务…...
自动化报告pptx-python|如何将pandas的表格写入PPTX(二)
本篇延续:自动化报告的前奏|使用python-pptx操作PPT(一) 因为在pptx-python中使用table,需要单个cell逐一输入,于是在想有没有pandas可以直接读入的方式, 有两个开源项目有类似的功能: PandasToPowerpointmspandas其中mspandas写的比较复杂,PandasToPowerpoint比较易懂…...
Ruby详解及安装流程
文章目录 一、Ruby详解二、Ruby安装流程三、Ruby案例四、Ruby常见问题五、Ruby优缺点六、热门文章 一、Ruby详解 Ruby是一种高级编程语言,具有简单易学、灵活多变、优雅美丽的语法特点。它是一种面向对象的编程语言,具有动态类型和解释型语言的特性。在…...

免费的ChatGPT网站 ( 7个 )
ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外,它还能够完成多种任务,如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用,而且免费的chatGPT网站,AI…...
python异步编程(1)——理论篇
1.理解多线程 当启动一个Python程序时,它会作为一个单独的进程运行在操作系统中。进程是操作系统分配资源(如内存和处理器时间)的基本单位。每个Python程序启动时,都会创建一个主线程。如果没有在代码中明确创建其他线程…...

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

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

如何将 h5 页面快速转换成微信小程序
Hello各位朋友们大家新的一月好呀!我是咕噜铁蛋!我知道在小程序开发中,有时候需要将H5页面转换成微信小程序页面。这样可以将原本的网页内容适配到小程序中,让用户能够更方便地访问和使用。在本文中,我将分享如何快速将…...
在Vue的模块开发中使用GPT的体验及总结
我这一周都在忙着实现一个页面,这个页面是通过vue基于element-ui来实现的。在这个过程中,我把页面拆分成多个组件,而组件的生成是通过Chat-GPT3来实现的。 这又是一次使用AI来协同开发的体验,觉得有必要总结一下: 遵循…...
Java常见算法题解析面试题(中)
11.判断101-200之间有多少个素数,并输出所有素数。【重点】 程序分析:判断素数的方法,用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 public class lianxi { publi…...

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

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

vue+element 换肤功能
1.首先建深色和浅色两个主题样式变量样式表,样式表名和按钮中传入的值一样,本例中起名为default.scss和dark.scss 2.在data中定义主题变量名 zTheme:‘defalut’,默认引用defalut.scss, 在点击按钮时切换引用的样式表,达到换肤效果…...
python魔法函数[全面]
1、init 用于初始化对象的属性和状态 当创建一个对象时,Python会自动调用该对象的__init__方法。 这个方法用于初始化对象的属性和状态,是对象创建过程中的一个重要环节 2、new # 通常我们不需要重写__new__方法,除非我们正在进行一些非常…...

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

爬虫学习笔记-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 …...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...