SpringBoot+redis实现分布式锁
一、分布式锁核心设计原则实现分布式锁需满足以下核心要求缺一不可互斥性同一时间只能有一个客户端持有锁非阻塞获取锁失败时直接返回不阻塞超时释放防止客户端持有锁后宕机导致锁永久无法释放原子性加锁、解锁操作必须是原子的避免并发下出现锁异常可重入可选同一客户端持有锁后可重复获取锁。二、技术选型与依赖准备1. 核心依赖Maven!-- SpringBoot Redis 整合依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!-- 连接池提升Redis性能 --dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependency!-- JSON序列化可选用于存储复杂值 --dependencygroupIdcom.alibaba/groupIdartifactIdfastjson2/artifactIdversion2.0.41/version/dependency2. Redis 配置application.ymlspring:redis:host:127.0.0.1port:6379password:# 无密码则留空database:0lettuce:pool:max-active:8# 最大连接数max-idle:8# 最大空闲连接min-idle:0# 最小空闲连接max-wait:-1ms# 连接等待时间三、核心实现Redis 分布式锁工具类基于 Redis 的SET NX EX命令实现原子加锁结合 Lua 脚本实现原子解锁避免“误删锁”问题完整工具类如下importorg.springframework.data.redis.core.RedisCallback;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.core.script.DefaultRedisScript;importorg.springframework.stereotype.Component;importjavax.annotation.Resource;importjava.util.Collections;importjava.util.UUID;importjava.util.concurrent.TimeUnit;/** * Redis 分布式锁工具类可重入、原子操作、超时释放 */ComponentpublicclassRedisDistributedLock{ResourceprivateRedisTemplateString,StringredisTemplate;// 锁前缀避免key冲突privatestaticfinalStringLOCK_PREFIXdistributed:lock:;// 线程本地存储存储当前线程持有的锁标识用于可重入privatestaticfinalThreadLocalStringLOCK_IDENTIFIERnewThreadLocal();/** * 获取分布式锁 * param lockKey 锁标识如order:1001 * param expireTime 锁过期时间毫秒 * return 是否获取成功 */publicbooleanlock(StringlockKey,longexpireTime){StringrealKeyLOCK_PREFIXlockKey;StringidentifierLOCK_IDENTIFIER.get();// 可重入逻辑当前线程已持有锁直接返回成功if(identifier!nullredisTemplate.hasKey(realKey)identifier.equals(redisTemplate.opsForValue().get(realKey))){returntrue;}// 生成唯一标识避免误删其他线程的锁identifierUUID.randomUUID().toString();// SET NX EX 命令原子性加锁不存在则设置同时设置过期时间BooleansuccessredisTemplate.opsForValue().setIfAbsent(realKey,identifier,expireTime,TimeUnit.MILLISECONDS);if(Boolean.TRUE.equals(success)){LOCK_IDENTIFIER.set(identifier);returntrue;}returnfalse;}/** * 释放分布式锁Lua脚本保证原子性 * param lockKey 锁标识 * return 是否释放成功 */publicbooleanunlock(StringlockKey){StringrealKeyLOCK_PREFIXlockKey;StringidentifierLOCK_IDENTIFIER.get();// 未持有锁直接返回if(identifiernull){returnfalse;}// Lua脚本判断标识是否匹配匹配则删除原子操作StringluaScript if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end ;DefaultRedisScriptLongredisScriptnewDefaultRedisScript();redisScript.setScriptText(luaScript);redisScript.setResultType(Long.class);// 执行脚本LongresultredisTemplate.execute(redisScript,Collections.singletonList(realKey),identifier);// 释放成功清除线程本地标识if(result!nullresult0){LOCK_IDENTIFIER.remove();returntrue;}returnfalse;}}四、使用示例业务场景以“订单创建”为例演示分布式锁的使用避免同一订单被重复创建importorg.springframework.stereotype.Service;importjavax.annotation.Resource;ServicepublicclassOrderService{ResourceprivateRedisDistributedLockredisDistributedLock;/** * 创建订单加分布式锁防重复 * param orderId 订单ID * return 创建结果 */publicStringcreateOrder(StringorderId){// 1. 定义锁标识和过期时间5秒避免死锁StringlockKeyorder:orderId;longexpireTime5000;// 2. 获取锁if(!redisDistributedLock.lock(lockKey,expireTime)){return操作太频繁请稍后再试;}try{// 3. 核心业务逻辑模拟订单创建System.out.println(开始创建订单orderId);// 业务处理...return订单创建成功orderId;}finally{// 4. 释放锁必须在finally中执行避免异常导致锁无法释放redisDistributedLock.unlock(lockKey);}}}五、关键避坑点避免硬编码过期时间根据业务耗时合理设置过短可能导致业务未完成锁已释放过长可能导致锁占用时间久锁标识必须唯一使用UUID生成避免同一锁被不同线程释放解锁必须在finally中无论业务是否抛出异常都要释放锁可重入设计通过ThreadLocal存储当前线程的锁标识支持同一线程多次获取锁。总结SpringBoot整合Redis实现分布式锁的核心是SET NX EX原子加锁 Lua脚本原子解锁解决互斥性和原子性问题工具类需实现可重入、超时释放、防误删核心特性适配生产环境使用时需注意锁过期时间设置、解锁操作的原子性以及finally中释放锁的规范。

相关新闻

从原理到实战:Linux KVM,云时代真正的底层隐形引擎

从原理到实战:Linux KVM,云时代真正的底层隐形引擎

在云计算、数据中心以及企业IT基础设施架构中,虚拟化技术是实现资源高效利用、弹性扩展的核心支撑。 KVM作为Linux虚拟化方案中的佼佼者。借助现代CPU提供的硬件虚拟化扩展(如Intel的VT - x和AMD的AMD - V)实现高效虚拟化。硬件虚拟化允许在同…

2026/7/6 2:04:22 阅读更多 →
HTML+CSS实现左右箭头

HTML+CSS实现左右箭头

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>CSS 带箭头的虚线</title><style>/* 基…

2026/7/6 9:51:32 阅读更多 →
如何正确理解功率循环曲线

如何正确理解功率循环曲线

近年来IGBT的可靠性问题一直受到行业的广泛关注,特别是风力发电、轨道交通等应用领域。IGBT的可靠性通常用以芯片结温变化为衡量目标的功率循环曲线和基板温度变化为衡量目标的温度循环曲线来评估。引起IGBT可靠性问题的原因主要是IGBT是由多种膨胀系数不同的材料焊接在一起,…

2026/7/5 0:16:39 阅读更多 →

最新新闻

输电线路绝缘子YOLO训练数据集:含完好与破损实物图及标准txt标签

输电线路绝缘子YOLO训练数据集:含完好与破损实物图及标准txt标签

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;输电线路巡检场景下的绝缘子检测专用YOLO格式数据集&#xff0c;覆盖正常和缺陷两类真实拍摄图像&#xff0c;图片分辨率适中&#xff0c;背景为典型野外架空线路环境&#xff0c;具备实际部署所需的复杂背景与…

2026/7/6 10:01:21 阅读更多 →
Windows任务栏透明美化终极指南:5种模式让你的桌面焕然一新

Windows任务栏透明美化终极指南:5种模式让你的桌面焕然一新

Windows任务栏透明美化终极指南&#xff1a;5种模式让你的桌面焕然一新 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 厌倦了Windows系统…

2026/7/6 9:59:19 阅读更多 →
医生用AI不是偷懒,是临床决策的静默升级

医生用AI不是偷懒,是临床决策的静默升级

1. 这不是医德滑坡&#xff0c;而是临床决策方式的静默升级上周陪媳妇去西安一家三甲医院看胃部不适&#xff0c;挂的是消化内科的专家号——抢了整整两天才成功。从挂号、签到、候诊&#xff0c;到助理初筛登记&#xff0c;流程和十年前几乎没变。但就在我们坐在诊室外长椅上等…

2026/7/6 9:59:19 阅读更多 →
【毕业设计】SpringBoot+Vue+MySQL 船舶监造系统平台源码+数据库+论文+部署文档

【毕业设计】SpringBoot+Vue+MySQL 船舶监造系统平台源码+数据库+论文+部署文档

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。博主介绍&#xff1a;&#x…

2026/7/6 9:59:19 阅读更多 →
Python Selenium自动化登录淘宝微博实战:环境搭建、反反爬策略与代码详解

Python Selenium自动化登录淘宝微博实战:环境搭建、反反爬策略与代码详解

1. 项目概述与核心价值 最近在技术社群里&#xff0c;经常看到有朋友在问&#xff0c;怎么用Python模拟登录淘宝或者微博&#xff0c;然后自动做一些点击、签到之类的操作。这确实是个挺常见的需求&#xff0c;无论是为了做数据采集、自动化测试&#xff0c;还是单纯想解放双手…

2026/7/6 9:57:16 阅读更多 →
层次分析法(AHP)Python 实战:3步构建决策模型,CR值<0.1验证

层次分析法(AHP)Python 实战:3步构建决策模型,CR值<0.1验证

层次分析法&#xff08;AHP&#xff09;Python实战&#xff1a;从理论到代码实现引言在日常生活和工作中&#xff0c;我们经常面临需要做出复杂决策的场景。比如选择旅游目的地时&#xff0c;需要在景色、费用、交通便利性等多个因素之间权衡&#xff1b;企业采购设备时&#x…

2026/7/6 9:57:16 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性&#xff1a;5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域&#xff0c;单元测试是保证代码质量的重要环节。当应用涉及数据库操作时&#xff0c;测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南&#xff1a;用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南&#xff1a;告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻