分布式锁如何实现
分布式是现在的比较主流的技术,常常和微服务一起出现。那么对于多个实例之间,如何证分布式系统中多个进程或线程同步访问共享资源呢?我们其实一想到的就是锁,我们在java里边有 synchronized, 在python里有lock,但是这个只能到证在单机的时候不会出现线程安全问题,但是在分布式的环境下,这种方式就没有任何的作用了。shigen在实习的时候就遇到了这样的问题,最开始还不知道分布式锁。但是今天,这篇文章将会带你读懂分布式锁和它的实现方式。
题外话
先来题外话引入今天的话题哈,现在的面试,八股文总会提到超卖问题怎么解决,恰恰在昨天下班的时候看到了这样的一篇文章。背景我也不想去研究了,毕竟咱也不是重度的吃瓜群众,比较吸引我的事超额超卖问题。当时不由得一惊:擦,这不就是面试经常问的问题吗?要是同行写出的程序问题,这不得去祭天。

吓得我赶紧回来研究一下分布式锁。
分布式锁
概念是这样的:分布式锁是一种用于保证分布式系统中多个进程或线程同步访问共享资源的技术
同我们认识的synchronized锁和其它的lock锁一样,分布式锁也是有要求的:
分布式锁要求
- 互斥性:在任意时刻只能有一个客户端持有锁。
- 不会发生死锁:即使持有锁的客户端发生故障,也能保证锁最终会被释放。
- 具有容错性:分布式锁需要能够容忍节点故障等异常情况,保证系统的稳定性。
实现方案
1.基于数据库实现的分布式锁
可以通过数据库的乐观锁或悲观锁实现分布式锁,但是由于数据库的操作比较慢,不适合高并发场景。
2.基于 ZooKeeper 实现的分布式锁
ZooKeeper 是一个高可用性的分布式协调服务,以前在微服务中也作为注册中心使用,是CP的。可以通过它来实现分布式锁。但是使用 ZooKeeper 需要部署额外的服务,增加了系统复杂度。所以,shigen也很少使用这个。
3.基于 Redis 实现的分布式锁
Redis支持分布式部署,可以通过Redis的原子操作实现分布式锁,而且具有高性能和高可用性。
具体实现
mysql
这里需要注意:不要小瞧了数据库,数据库可以实现悲观锁和乐观锁
悲观锁
悲观锁的概念可以理解为:不管是谁来操作数据,我都要上一把锁!

乐观锁
其实就是在数据修改的时候加上一个版本号,我们在修改的时候加上版本号作为去修改的条件。这一点shigen是使用elasticSearch的时候也遇到过。

其实这样看起来,mysql实现分布式锁还是比较简单的。但是你想想,都上分布式了,肯定对性能上有要求。这样的操作,DB上的压力很大,mysql需要不断的从磁盘中加载数据到内存中,性能上的提升不是很明显的。
zookeeper
实现稍微的复杂,这里不讲,目前也没有接触到这样的项目。不过它在CAP理论中是CP理论,对于数据的一致性要求高的可以考虑采取它作为解决方案。
redis
最后讲一下给予内存的数据库redis,提到redis,就不得不提到redLock,俗称的红锁。我们在Spring boot的项目中配置好redisson即可使用。

其实写法上和Java的lock锁差不多,都有获得锁、释放锁的过程。
总结
在文章的最后我们来一波小总结, 即:Redis VS Zookeeper。
Redis 和 ZooKeeper 都可以用来实现分布式锁,它们在实现分布式锁的机制和原理上有所不同,具体区别如下:
- 数据存储方式:Redis 将锁信息存储在内存中,而 ZooKeeper 将锁信息存储在 ZooKeeper 的节点上,占用的是磁盘的空间。
- 锁的释放:Redis 的锁是通过设置锁的过期时间来自动释放的,而 ZooKeeper 的锁需要手动释放,如果锁的持有者出现宕机或网络中断等情况,需要等待锁的超时时间才能自动释放。
- 锁的竞争机制:Redis 使用的是单机锁,即所有请求都直接连接到同一台 Redis 服务器,容易发生单点故障;而 ZooKeeper 使用的是分布式锁,即所有请求都连接到 ZooKeeper 集群,具有较好的可用性和可扩展性——集群的优势。
- 一致性:Redis 的锁是非严格意义下的分布式锁,因为在多台机器上运行多个进程时,由于 Redis 的主从同步可能会存在数据不一致的问题;而 ZooKeeper 是强一致性的分布式系统,保证了数据的一致性。
- 性能:Redis 的性能比 ZooKeeper 更高,数据的存储位置不同,一个是内存,另一个是在磁盘中。
总之,Redis 适合实现简单的分布式锁场景,而 ZooKeeper 适合实现复杂的分布式协调场景,也就是 ZooKeeper 适合强一致性的分布式系统。具体场景具体的分析。
以上就是《分布式锁如何实现》的全部内容了,觉得不错的话,记得点赞支持一下哈!
与shigen一起,每天不一样!
相关文章:
分布式锁如何实现
分布式是现在的比较主流的技术,常常和微服务一起出现。那么对于多个实例之间,如何证分布式系统中多个进程或线程同步访问共享资源呢?我们其实一想到的就是锁,我们在java里边有 synchronized, 在python里有lock,但是这个…...
Mysql存储-EAV模式
Mysql存储-EAV模式 最近又又又搞一点新东西,要整合不同业务进行存储和查询,一波学习过后总结了一下可扩展性MAX的eav模式存储。 在eav这里的数据结构设计尤为关键,需要充分考虑你需要使用的字段、使用场景,当数据结构设计完成后便…...
全局变量报错:\Output\STM32.axf: Error: L6218E: Undefined symbol
全局变量报错: .\Output\STM32.axf: Error: L6218E: Undefined symbol key_num (referred from main.o). 这里只说全局变量哦,这是因为你在调用的.c文件里 把定义写在了函数里面,写函数外面就没事了 改为: .h的声明文件根本不用写…...
算法错题簿(持续更新)
自用算法错题簿,按算法与数据结构分类 python1、二维矩阵:记忆化搜索dp2、图论:DFS3、回溯:129612964、二叉树:贪心算法5、字符串:记忆化搜索6、01字符串反转:结论题7、二进制数:逆向…...
基于Springboot实现疫情网课管理系统项目【项目源码+论文说明】
基于Springboot实现疫情网课管理系统演示 摘要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于疫情网课管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了疫情…...
Linux文件与目录的增删改查
一、增 1、mkdir命令 作用: 创建一个新目录。 格式: mkdir [选项] 要创建的目录 常用参数: -p:创建目录结构中指定的每一个目录,如果目录不存在则创建,如果目录已存在也不会被覆盖。 用法示例&a…...
JVM的内存模型
一、JVM的内存模型 1.1、目标 内存模型是用来描述JVM内部的内存结构和内存管理的模型。它定义了JVM在运行Java程序时所需要的各种内存区域,以及每个内存区域的作用和特点。 1.2、结构划分 1.2.1、栈 每个线程在执行Java方法时会创建一个栈帧(Stack …...
数据采集项目之业务数据(三)
1. Maxwell框架 开发公司为Zendesk公司开源,用java编写的MySQL变更数据抓取软件。内部是通过监控MySQL的Binlog日志,并将变更数据以JSON格式发送到Kafka等流处理平台。 1.1 MySQL主从复制 主机每次变更数据都会生成对应的Binlog日志,从机可…...
vuedraggable影响点击事件的解决办法
在工作中有很多场景需要针对广告、商品、信息推广等进行一个排序,或者对展示的顺序做出调整,方便放用户第一眼看到自己感兴趣的信息,因此避免不了需要用到排序的插件,这里以vue为例子,采用的插件是vuedraggable,这个插件针对于排序的功能相对完善,官网地址:vuedraggable官网 但…...
Linux 中的 grep 命令
Linux 中的 grep 命令是一个强大的文本搜索工具,它允许用户在文件中查找指定的文本模式,并将匹配的行打印出来。grep 是“Global Regular Expression Print”的缩写,它使用正则表达式来进行文本搜索,因此具有强大的灵活性和功能。…...
阶段五-Day03-Ajax
一、JavaWeb中路径的说明 1. JavaWeb中的路径 在JavaWeb中, 路径分为相对路劲和绝对路径两种: 相对路径: ./ 表示当前目录 ../ 表示当前文件所在目录的上一级目录 绝对路径: 完整的路径名 2. 在JavaWeb中/的不同意义 /斜杠如果被浏览器解析,得到的是 协议本地ip端口号…...
EPOLL单线程版本 基于reactor 的 httpserver文件下载 支持多个客户端同时处理
之前写了一个httpserver的问价下载服务器 如果有多个客户端请求过来只能串行处理必须得等当前的操作完成之后才会处理 另外还存在 文件大的时候 会出错 处理不了 原因就是 sendfile是在一个while循环中处理的 当调用send失败返回-1之后 就 结束了 而一般来讲 se…...
uniapp实现微信小程序隐私协议组件封装
uniapp实现微信小程序隐私协议组件封装。 <template><view class"diygw-modal basic" v-if"showPrivacy" :class"showPrivacy?show:" style"z-index: 1000000"><view class"diygw-dialog diygw-dialog-modal bas…...
【Node.js】NPM 和 package.json
NPM npm 是 Node.js 的包管理工具,基于命令行,用于安装、升级、移除、管理依赖项。 常用命令: npm init:初始化一个新的 npm 项目,创建 package.json 文件。(括号里为默认值) description&am…...
周总结【java项目】
项目进度: 学习了JavaFX,下载了sceneBuilder辅助工具构建窗口(目前建立了登陆,注册,忘记密码的界面),然后是学习了MySQL的连接,现在的项目是刚连上数据库; 下一步&…...
《深度不确定条件下的决策:从理论到实践》PDF
制定未来计划时需要预测变化,尤其是制定长期计划或针对罕见事件的计划时。当这些变化存在高度不确定性的时候,这种预期就变得越来越困难。 今天给大家介绍的这本《深度不确定条件下的决策:从理论到实践》正是解决以上问题的良方。完整书籍文…...
【MySQL】表的基础增删改查
前面我们已经知道怎么来创建表了,接下来就来对创建的表进行一些基本操作。 这里先将上次创建的表删除掉: mysql> use test; Database changedmysql> show tables; ---------------- | Tables_in_test | ---------------- | student | -----…...
第11章 Redis(二)
11.11 Redis 哨兵机制和集群有什么区别 难度:★★★ 重点:★★ 白话解析 前面的题目都是Redis的原理,接下来就是实际使用的问题了,首先Redis为了保证高可用,在微服务场景下必须是部署集群的,而Redis的集群部署通常就两种方式:主从和Redis Cluster。 参考答案 1、主从…...
mybatis配置entity下不同文件夹同类型名称的多个类型时启动springboot项目出现TypeException源码分析
记录问题:当配置了 mybatis.type-aliases-packagecom.runjing.erp.entity 配置项时,如果entity文件夹下存在不同子文件夹下的同名类型时,mybatis初始化加载映射时会爆出org.apache.ibatis.type.TypeException: The alias TestDemo…...
淘宝商品评论数据分析接口,淘宝商品评论接口
淘宝商品评论数据分析接口可以通过淘宝开放平台API获取。 通过构建合理的请求URL,可以向淘宝服务器发起HTTP请求,获取商品评论数据。接口返回的数据一般为JSON格式,包含了商品的各种评价信息。 获取到商品评论数据后,可以对其进…...
Bili2text:重构B站视频内容提取流程的智能解决方案
Bili2text:重构B站视频内容提取流程的智能解决方案 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在信息爆炸的视频时代,教育工作者、…...
18年产品经理生涯精华:从交付到规划,项目管理、解决方案、业务理解深度解析!
本期访谈只有1位老师,大海老师,18年工作经验,从干交付,到项目管理,再到资深技术专家、解决方案专家,目前做的更多的是业务规划、产品规划,是从一线实战走到真正的专家层面,老师分享的…...
开源工具Wand-Enhancer功能增强技术解析与实战指南
开源工具Wand-Enhancer功能增强技术解析与实战指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 一、问题定位:WeMod功能增强的核心挑战 …...
东华OJ-基础题-33-数字之和(C++)
问题描述 输入一个正整数,求这个正整数的各位数字之和。输入说明 你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组测试数据为正整数,每行一个N,N小于20000输出说明 对每组测试数据,你的程…...
Svelte 现实世界指南(四)
原文:zh.annas-archive.org/md5/14dc6d5ba3099ee8ed407418d0a0711b 译者:飞龙 协议:CC BY-NC-SA 4.0 第十五章:使用过渡实现无障碍 在过去两章中,我们学习了如何在 Svelte 中使用过渡。当正确使用时,过渡可…...
3个高效管理技巧让Windows右键菜单秒变清爽
3个高效管理技巧让Windows右键菜单秒变清爽 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是日常操作的重要入口,但随着软件安装增多…...
weixin279基于微信小程序的场地预约设计与实现+ssm(文档+源码)_kaic
第4章 系统实现 4.1 管理员权限的功能模块实现界面 4.1.1系统登录功能模块的界面实现 当系统调试运行好后,可以先使用系统登录功能,本功能相当于系统的屏障。在本界面里可以看到系统的标题和用户名、密码的文本框。在登录界面里还加入了登录按钮。系统…...
五层电梯MCGS7.7嵌入版与三菱PLC的联动编程实践
5五层电梯MCGS7.7嵌入版和三菱PLC联机程序调试电梯控制程序最头疼的莫过于通讯不稳定。上个月刚搞完一个五层电梯项目,MCGS7.7触摸屏和三菱FX3U的联机调试过程简直像坐过山车——楼层显示乱跳、按钮状态丢失这些幺蛾子接踵而来。今天咱就唠唠这个项目的实战经验。硬…...
解锁Windows效率提升:免费工具Winhance-zh_CN全功能指南
解锁Windows效率提升:免费工具Winhance-zh_CN全功能指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…...
HUSB238 USB-C PD物理层驱动设计与ESP32集成指南
1. HUSB238 驱动库概述HUSB238 是由 Microchip 推出的 USB Type-C 和 USB PD(Power Delivery)源端(Source)控制器,专为高集成度、小尺寸 USB-C 充电应用设计。其核心功能包括:USB-C 插拔检测(CC…...
