Java并发编程 什么是分布式锁 跟其他的锁有什么区别 底层原理 实战讲解
目录
一、分布式锁的定义与核心作用
二、分布式锁与普通锁的核心区别
三、分布式锁的底层原理与实现方式
1. 核心实现原理
2. 主流实现方案对比
3. 关键技术细节
四、典型问题与解决方案
五、总结
六、具体代码实现
一、分布式锁的定义与核心作用
分布式锁是一种在分布式系统中协调多进程/节点对共享资源进行互斥访问的机制。其核心作用是确保同一时间只有一个进程能够操作共享资源,解决分布式环境下的并发冲突问题(如超卖、数据覆盖等)。
二、分布式锁与普通锁的核心区别
| 对比维度 | 普通锁(线程/进程锁) | 分布式锁 |
| 作用范围 | 单机环境(同一JVM或进程内) | 跨机器、跨JVM的分布式环境 |
| 数据存储 | 基于内存(如synchronized、Lock) | 基于外部存储(如Redis、ZooKeeper、数据库) |
| 锁失效风险 | 无网络延迟或节点故障风险 | 需处理网络分区、节点宕机、时钟同步等问题 |
| 典型应用场景 | 单机多线程资源竞争 | 分布式服务、微服务集群、数据库流量控制等 |
三、分布式锁的底层原理与实现方式
1. 核心实现原理
- 互斥性:通过唯一标识(如Redis的Key、ZooKeeper节点路径)确保同一时间仅有一个客户端持有锁。
- 超时机制:设置锁的过期时间,避免死锁(如Redis的
PX参数)。 - 原子性操作:加锁、解锁需通过原子命令(如Redis的
SETNX+EXPIRE组合或Lua脚本)实现。
2. 主流实现方案对比
| 实现方式 | 原理 | 优点 | 缺点 |
| Redis | 基于 命令,结合唯一值(UUID)和Lua脚本保证原子性 。 | 高性能、易扩展 | 主从切换可能导致锁失效(需RedLock或Redisson优化) |
| ZooKeeper | 基于临时有序节点 ,最小序号节点获得锁,通过Watcher监听节点变化 。 | 强一致性、自动释放锁(节点断开则删除临时节点) | 性能较低、实现复杂 |
| 数据库 | 通过唯一约束(如MySQL行锁、乐观锁)或专用锁表 。 | 简单易用 | 性能差、高并发场景易成瓶颈 |
3. 关键技术细节
- 锁续期(看门狗机制):Redisson通过后台线程定期检查并延长锁有效期,避免业务未完成时锁过期。
- 可重入性:通过记录线程标识和重入次数(如Redis的Hash结构)支持同一线程多次加锁。
- 容错设计:
-
- Redis的RedLock算法需半数以上节点加锁成功,避免主从切换问题。
- ZooKeeper通过临时节点自动清理解决进程宕机导致的死锁。
四、典型问题与解决方案
- 锁过期但业务未完成
-
- 方案:使用守护线程续期(如Redisson的看门狗)或超时回滚+告警。
- 锁误删(非持有者释放锁)
-
- 方案:解锁时校验唯一标识(如UUID),并通过Lua脚本保证原子性。
五、总结
分布式锁通过外部存储系统实现跨进程资源互斥,需权衡性能、一致性和复杂度。Redis适合高频低一致性要求的场景,ZooKeeper适用于强一致性但低并发场景,而数据库锁仅作为简单场景的备选。实际选型需结合业务需求和容错能力(如Redisson整合Redis的方案较优)。
六、具体代码实现
我们这边是查询数据
首先如果缓存命中 就直接返回数据
否则是要去数据库查询数据
使用分布式锁 让同一时间只能允许一个线程更新缓存
防止碰巧有写入缓存的线程结束
我们可以进行一个二次检查 防止那个碰巧情况
因为缓存一旦存在 再次写入 数据会进行叠加
确认了在分布式锁内 缓存依旧为空
之后我们就可以去数据库查询数据
@Override// 这边我们使用redis来辅助mysql查询 因为数据库压力实在是太大了(服务器带宽太低)public List<GetAllContentResp> getAll() {// 异常处理try {// 1. 构建带业务标识的复合KeyString cacheKey = "balloonSentences:all" + DATA_VERSION;// 2. 带熔断的缓存读取 如果缓存击中 直接返回即可 返回的是所有数据List<GetAllContentResp> cachedData = redisService.getList(cacheKey, 0, -1);if (cachedData != null) {if (cachedData.isEmpty()) { // 空值缓存处理return Collections.emptyList();}elasticsearchService.saveProduct(cachedData); // 写到elasticsearch里面去return cachedData;} else {// 3. 分布式锁防穿透 同一时间只允许一个线程更新缓存RLock lock = redissonClient.getLock("lock:" + cacheKey);try {lock.lock(5, TimeUnit.SECONDS);// 二次检查cachedData = redisService.getList(cacheKey, 0, -1);if (cachedData != null) return cachedData;// 4. 数据库查询List<GetAllContentResp> dbData = tSentencesMapper.getAll();// 5. 异步写缓存和elasticsearch(保证数据库操作成功)CompletableFuture.runAsync(() -> {// 随机化TTL防雪崩redisService.setList(cacheKey, dbData, RandomUtil.randomInt(30, 60), TimeUnit.MINUTES);elasticsearchService.saveProduct(dbData); // 写到elasticsearch里面去});return dbData;} finally {lock.unlock();}}} catch (Exception e) {e.printStackTrace();}return null;}相关文章:
Java并发编程 什么是分布式锁 跟其他的锁有什么区别 底层原理 实战讲解
目录 一、分布式锁的定义与核心作用 二、分布式锁与普通锁的核心区别 三、分布式锁的底层原理与实现方式 1. 核心实现原理 2. 主流实现方案对比 3. 关键技术细节 四、典型问题与解决方案 五、总结 六、具体代码实现 一、分布式锁的定义与核心作用 分布式锁是一种在分布…...
【react】在react中async/await一般用来实现什么功能
目录 基本概念 工作原理 优点 注意事项 底层原理 实际应用场景 1. 数据获取 (API 请求) 2. 表单提交 3. 异步状态管理 4. 异步路由切换 5. 异步数据预加载 6. 第三方 API 调用 7. 文件上传/下载 8. 路由导航拦截 关键注意事项 基本概念 async 函数:用…...
Axure项目实战:智慧城市APP(六)市民互动(动态面板、显示与隐藏)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:市民互动 主要内容:动态面板、显示与隐藏交互应用 应用场景:AI产品交互、互动类应用 案例展示: 案例视频&am…...
为何服务器监听异常?
报错: 执行./RCF后出现监听异常--在切换网络后,由于前面没有退出./RCF执行状态;重新连接后,会出现服务器监听异常 原因如下: 由于刚开始登录内网,切换之后再重新登录内网,并且切换网络的过程中…...
1.认识Excel
一 Excel 可以用来做什么 二 提升技巧 1.数据太多 2.计算太累 3.提升数据的价值和意义 4.团队协作 三 学习目标 学习目标不是为了掌握所有的技能,追逐新功能。而是学知识来解决需求,如果之前的技能和新出的技能都可以解决问题,那不学新技能也…...
目标跟踪——deepsort算法详细阐述
deepsort 算法详解 Unmatched Tracks(未匹配的轨迹) 本质角色: 是已存在的轨迹在当前帧中“失联”的状态,即预测位置与检测结果不匹配。 生命周期阶段: 已初始化: 轨迹已存在多帧,可能携带历史信息(如外观特征、运动模型)。 未被观测到: 当前帧中未找到对应的检测框…...
AI Agent 是什么?从 Chatbot 到自动化 Agent(LangChain、AutoGPT、BabyAGI)
1. 引言:AI Agent 的演进 AI Agent(人工智能智能体)是 AI 发展的重要方向之一。早期的 AI 主要以 Chatbot 形式存在,如客服机器人、智能助手等,主要基于 NLP 技术进行任务处理。而随着大模型(LLM)能力的提升,AI Agent 逐步演进为能够自主执行任务的智能体,如 AutoGPT…...
ngx_http_core_root
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_loc_conf_t *clcf conf;ngx_str_t *value;ngx_int_t alias;ngx_uint_t …...
python康复日记-request库的使用,爬虫自动化测试
一,request的简单应用 #1请求地址 URLhttps://example.com/login #2参数表单 form_data {username: admin,password: secret } #3返回的响应对象response response requests.post(URL,dataform_data,timeout5 ) #4处理返回结果,这里直接打印返回网页的…...
光谱范围与颜色感知的关系
光谱范围与颜色感知是光学、生理学及技术应用交叉的核心课题,两者通过波长分布、人眼响应及技术处理共同决定人类对色彩的认知。以下是其关系的系统解析: 1.基础原理:光谱范围与可见光 光谱范围定义: 电磁波谱中能被特定…...
OpenCV vs MediaPipe:哪种方案更适合实时手势识别?
引言 手势识别是计算机视觉的重要应用,在人机交互(HCI)、增强现实(AR)、虚拟现实(VR)、智能家居控制、游戏等领域有广泛的应用。实现实时手势识别的技术方案主要有基于传统计算机视觉的方法&am…...
el-select下拉框,搜索时,若是匹配后的数据有且只有一条,则当失去焦点时,默认选中该条数据
1、使用指令 当所需功能只能通过直接的 DOM 操作来实现时,才应该使用自定义指令。可使用方法2封装成共用函数,但用指令他人复用时比较便捷。 <el-tablev-loading"tableLoading"border:data"tableList"default-expand-allrow-key…...
网络地址转换技术(2)
NAT的配置方法: (一)静态NAT的配置方法 进入接口视图配置NAT转换规则 Nat static global 公网地址 inside 私网地址 内网终端PC2(192.168.20.2/24)与公网路由器AR1的G0/0/1(11.22.33.1/24)做…...
Python正则表达式(一)
目录 一、正则表达式的基本概念 1、基本概念 2、正则表达式的特殊字符 二、范围符号和量词 1、范围符号 2、匹配汉字 3、量词 三、正则表达式函数 1、使用正则表达式: 2、re.match()函数 3、re.search()函数 4、findall()函数 5、re.finditer()函数 6…...
【TI MSPM0】PWM学习
一、样例展示 #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();DL_TimerG_startCounter(PWM_0_INST);while (1) {__WFI();} } TimerG0输出一对边缘对齐的PWM信号 TimerG0会输出一对62.5Hz的边缘对齐的PWM信号在PA12和PA13引脚上,PA12被…...
MySQL: 创建两个关联的表,用联表sql创建一个新表
MySQL: 创建两个关联的表 建表思路 USERS 表:包含用户的基本信息,像 ID、NAME、EMAIL 等。v_card 表:存有虚拟卡的相关信息,如 type 和 amount。关联字段:USERS 表的 V_CARD 字段和 v_card 表的 v_card 字段用于建立…...
更改 vscode ! + table 默认生成的 html 初始化模板
vscode ! 快速成的 html 代码默认为: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…...
使用LVS的 NAT 模式实现 3 台RS的轮询访问
节点规划 1、配置RS RS的网络配置为NAT模式,三台RS的网关配置为192.168.10.8 1.1配置RS1 1.1.1修改主机名和IP地址 [rootlocalhost ~]# hostnamectl hostname rs1 [rootlocalhost ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.10.7/24…...
R 基础语法
R 基础语法 引言 R 是一种针对统计计算和图形表示而设计的编程语言和环境。它广泛应用于统计学、生物信息学、数据挖掘等领域。本文将为您介绍 R 语言的基础语法,帮助您快速上手。 R 的基本结构 R 语言的基本结构包括:变量、数据类型、运算符、控制结构、函数等。 变量 …...
MySQL实战(尚硅谷)
要求 代码 # 准备数据 CREATE DATABASE IF NOT EXISTS company;USE company;CREATE TABLE IF NOT EXISTS employees(employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT );DESC employees;CREATE TABLE IF NOT EXISTS departments…...
华为p10 plus 鸿蒙2.0降级emui9.1.0.228
需要用到的工具 HiSuite Proxy V3 华为手机助手11.0.0.530_ove或者11.0.0.630_ove应该都可以。 官方的通道已关闭,所以要用代理,127.0.0.1端口7777 https://www.firmfinder.ml/ https://professorjtj.github.io/v2/ https://hisubway.online/articl…...
C# Modbus RTU学习记录
继C# Modbus TCP/IP学习记录后,尝试串口通信。 操作步骤: 1.使用Visual Studio安装Nuget包NModbus.Serial。 2.使用Modbus Slave应用程序,工具栏Connection项,单击Connect,弹窗Connection Setup,修改Con…...
AI+Xmind自动生成测试用例(思维导图格式)
一、操作步骤: 步骤1:创建自动生成测试用例智能体 方式:使用通义千问/豆包智能体生成,以下两个是我已经训练好的智能体,直接打开使用即可 通义智能体: https://lxblog.com/qianwen/share?shareId=b0cd664d-5001-42f0-b494-adc98934aba5&type=agentCard 豆包智能…...
单片机 - 位运算详解(``、`|`、`~`、`^`、`>>`、`<<`)
单片机中的位运算详解(&、|、~、^、>>、<<) 位运算是单片机编程(C/C)中经常使用的技巧,用于高效地操作寄存器、I/O 端口和数据。以下是各位运算符的详细解析,并结合单片机实际应用举例。 …...
chrome插件开发之API解析-chrome.tabs.query
chrome.tabs.query 是 Chrome 扩展开发中用于查询浏览器标签页信息的 API。它允许你根据指定的条件获取当前浏览器中所有匹配的标签页。这个 API 返回一个 Promise,解析后会得到一个包含匹配标签页信息的数组。 常见用途 获取当前活动标签页:可以获取当…...
(二)手眼标定——概述+原理+常用方法汇总+代码实战(C++)
一、手眼标定简述 手眼标定的目的:让机械臂和相机关联,相机充当机械臂的”眼睛“,最终实现指哪打哪 相机的使用前提首先需要进行相机标定,可以参考博文:(一)相机标定——四大坐标系的介绍、对…...
3D点云的深度学习网络分类(按照作用分类)
1. 3D目标检测(Object Detection) 用于在点云中识别和定位目标,输出3D边界框(Bounding Box)。 🔹 方法类别: 单阶段(Single-stage):直接预测3D目标位置&am…...
【Linux网络-NAT、代理服务、内网穿透】
一、NAT技术 1.NAT技术背景 之前我们讨论了,IPV4协议中,IP地址数量不充足的问题 NAT技术当前解决IP地址不够用的主要手段,是路由器的一个重要功能 NAT(网络地址转换,Network Address Translation)是一种…...
Windows 和 Linux 操作系统架构对比以及交叉编译
操作系统与架构兼容性详解 1. 可执行文件格式:PE vs ELF Windows: PE (Portable Executable) 格式 详细解释: PE 格式是 Windows 下的可执行文件标准 包含多个区段(Sections),如代码段、数据段、资源段 文件头包含…...
heapq库的使用——python代码
Python中heapq库的基础使用方法和示例代码,包含详细注释说明: 1. 基本功能 heapq 实现的是最小堆(父节点值 ≤ 子节点值),核心操作包括: 插入元素:heappush(heap, item)弹出最小值:…...
