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

Spring Boot 整合 Lock4j + Redisson 实现分布式锁实战

本文基于 Spring Boot 2.7.x + MyBatis Plus 3.5.9,演示如何通过 Lock4j 与 Redisson 实现高可靠的分布式锁方案,解决高并发场景下的资源竞争问题。


一、依赖配置关键点

1.1 Maven 依赖(pom.xml)

			 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.41.0</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></exclusion><exclusion><groupId>org.redisson</groupId><!-- 使用 redisson-spring-data-27 替代,解决 Tuple NoClassDefFoundError 报错 --><artifactId>redisson-spring-data-34</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-data-27</artifactId><version>3.41.0</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>lock4j-redisson-spring-boot-starter</artifactId><version>2.2.7</version><exclusions><exclusion><artifactId>redisson-spring-boot-starter</artifactId><groupId>org.redisson</groupId></exclusion></exclusions></dependency>

1.2 依赖关系说明

依赖作用版本控制策略
lock4j-redisson-*Lock4j 分布式锁核心实现继承自项目 BOM 统一管理
redisson-spring-boot-starterRedisson 客户端 Starter显式指定版本保证兼容性
redisson-spring-data-27Spring Data 2.7 适配模块与 Spring Boot 2.7.x 版本严格对应

二、为什么需要显式排除依赖?

2.1 解决版本冲突问题

  • Lock4j 默认依赖的 Redisson 版本可能较低,通过 <exclusions> 排除后使用项目统一管理的 Redisson 3.41.0
  • Spring Data 版本适配:Spring Boot 2.7.x 对应 Spring Data 2.7,需使用 redisson-spring-data-27 模块

2.2 避免不必要依赖

  • 排除 spring-boot-starter-actuator:若项目未使用监控端点,减少无用依赖
  • 排除 redisson-spring-data-34:防止与 Spring Data 2.7 产生兼容性问题

三、配置验证(application.yml)

spring:# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优redis:host: 127.0.0.1 # 地址port: 6379 # 端口database: 0 # 数据库索引password: 123456 # 密码,建议生产环境开启
# Lock4j 配置项
lock4j:acquire-timeout: 3000 # 获取锁等待超时时间,默认为 3000 毫秒expire: 30000 # # 默认锁过期时间(毫秒),默认为 30 毫秒store-type: redis # 使用 Redis 实现

四、锁失败策略配置(核心防御机制)

4.1 DefaultLockFailureStrategy 源码解析

/*** 自定义获取锁失败策略,抛出 {@link ServiceException} 异常*/
@Slf4j
public class DefaultLockFailureStrategy implements LockFailureStrategy {@Overridepublic void onLockFailure(String key, Method method, Object[] arguments) {log.debug("[onLockFailure][线程:{} 获取锁失败,key:{} 获取失败:{} ]", Thread.currentThread().getName(), key, arguments);throw new ServiceException(GlobalErrorCodeConstants.LOCKED);}
}

关键设计点:

  • 日志分级:使用 debug 级别避免生产环境日志膨胀
  • 异常标准化:通过 GlobalErrorCodeConstants.LOCKED 统一返回 “请求过于频繁” 提示
  • 上下文保留:记录线程、锁Key、方法参数等关键信息便于问题排查

五、自动装配机制(集成关键)

5.1 DyhLock4jConfiguration 配置类

@AutoConfiguration(before = LockAutoConfiguration.class)
@ConditionalOnClass(name = "com.baomidou.lock.annotation.Lock4j")
public class DyhLock4jConfiguration {@Beanpublic DefaultLockFailureStrategy lockFailureStrategy() {return new DefaultLockFailureStrategy();}}

注解解析:

注解作用
@AutoConfigurationSpring Boot 3.0+ 新特性,替代传统 @Configuration 更精准控制加载顺序
before = LockAutoConfiguration.class确保在 Lock4j 默认配置前加载,避免 Bean 冲突
@ConditionalOnClass存在 Lock4j 注解时才生效,实现条件化装配

5.2 配置类加载流程说明

流程分解

1. Spring Boot 启动│└─▶ 扫描所有 AutoConfiguration 类│├─▶ 检测是否存在 Lock4j 注解(@ConditionalOnClass)│    ││    ├─ 存在 → 加载 DyhLock4jConfiguration│    │       ││    │       └─▶ 注册 DefaultLockFailureStrategy Bean│    │              ││    │              └─▶ 初始化 Lock4j 组件│    ││    └─ 不存在 → 跳过分布式锁配置│└─▶ 继续其他自动配置

关键节点说明

步骤说明对应代码片段
条件检测@ConditionalOnClass 注解检查 classpath 是否存在 com.baomidou.lock.annotation.Lock4j 类@ConditionalOnClass(name = “com.baomidou.lock.annotation.Lock4j”)
配置顺序控制@AutoConfiguration(before = LockAutoConfiguration.class) 确保自定义配置在 Lock4j 默认配置前加载@AutoConfiguration(before = LockAutoConfiguration.class)
Bean 注册通过 @Bean 注解将失败策略注入 Spring 容器@Bean public DefaultLockFailureStrategy lockFailureStrategy()

六、实战开发示例

@Service
@RequiredArgsConstructor
public class OrderService {private final OrderMapper orderMapper;// 分布式锁注解@Lock4j(name = "order_create_#{#orderDTO.userId}", // 动态锁名(SpEL)expire = 10000,      // 锁自动释放时间(毫秒)acquireTimeout = 2000 // 获取锁等待时间)@Transactionalpublic void createOrder(OrderDTO orderDTO) {// 1. 幂等校验Order existOrder = orderMapper.selectByUserId(orderDTO.getUserId());if (existOrder != null) {throw new ServiceException("订单已存在");}// 2. 业务操作(如扣减库存)reduceStock(orderDTO.getProductId());// 3. 创建订单Order order = new Order().setUserId(orderDTO.getUserId());orderMapper.insert(order);}
}

相关文章:

Spring Boot 整合 Lock4j + Redisson 实现分布式锁实战

本文基于 Spring Boot 2.7.x MyBatis Plus 3.5.9&#xff0c;演示如何通过 Lock4j 与 Redisson 实现高可靠的分布式锁方案&#xff0c;解决高并发场景下的资源竞争问题。 一、依赖配置关键点 1.1 Maven 依赖&#xff08;pom.xml&#xff09; <dependency><groupId&g…...

基于DrissionPage的表情包爬虫实现与解析(含源码)

目录 ​编辑 一、环境配置与技术选型 1.1 环境要求 1.2 DrissionPage优势 二、爬虫实现代码 三、代码解析 3.1 类结构设计 3.2 目录创建方法 3.3 图片链接获取 3.4 图片下载方法 四、技术升级对比 4.1 代码复杂度对比 4.2 性能测试数据 五、扩展优化建议 5.1 并…...

无限debugger实现原理

1. 直接调用 debugger 关键字 代码示例&#xff1a; debugger; // 手动触发调试器中断特点&#xff1a; 最简单的方式&#xff0c;直接插入 debugger 语句。若未在浏览器开发者工具中禁用断点&#xff0c;每次执行到此代码都会暂停。反制手段&#xff1a;可通过浏览器开发者…...

区间和数量统计 之 前缀和+哈希表

文章目录 1512.好数对的数目2845.统计趣味子数组的数目1371.每个元音包含偶数次的最长子字符串 区间和的数量统计是一类十分典型的问题&#xff1a;记录左边&#xff0c;枚举右边策略前置题目&#xff1a;统计nums[j]nums[i]的对数进阶版本&#xff1a;统计子数组和%modulo k的…...

全能 Sui 技术栈,构建 Web3 的未来

本文翻译自&#xff1a;FourPillarsFP&#xff0c;文章仅代表作者观点。 2025 年&#xff0c;SuiNetwork正在以一套全栈区块链策略强势出击&#xff0c;彻底打破加密行业的传统范式。正如 Mysten Labs 联合创始人 Adeniyi Abiodun 所说&#xff1a;“Sui 不只是一条区块链&…...

什么是爬虫?——从技术原理到现实应用的全面解析 V

什么是爬虫?——从技术原理到现实应用的全面解析 V 二十一、云原生爬虫架构设计 21.1 无服务器爬虫(AWS Lambda) # lambda_function.py import boto3 import requests from bs4 import BeautifulSoups3 = boto3.client(s3)def lambda_handler(event, context):# 抓取目标…...

(三) Trae 调试C++ 基本概念

调试C基本概念 一、调试基础概念1.1 调试信息格式1.2 DWARF格式和PDB格式生成(图解)1.3.典型工具链和调试信息 二、各工具链深度解析1. Clang 与 G 的 DWARF 差异 三 调试工具3.1 调试工具3.2 调试插件(Trae) 一、调试基础概念 1.1 调试信息格式 格式类型适用系统存在形式DWA…...

linux安装单节点Elasticsearch(es),安装可视化工具kibana

真的&#xff0c;我安装个es和kibana&#xff0c;找了好多帖子&#xff0c;问了好几遍ai才安装成功&#xff0c;在这里记录一下&#xff0c;我相信&#xff0c;跟着我的步骤走&#xff0c;99%会成功&#xff1b; 为了让大家直观的看到安装过程&#xff0c;我把我服务器的es和ki…...

Python项目--基于计算机视觉的手势识别控制系统

1. 项目概述 1.1 项目背景 随着人机交互技术的快速发展&#xff0c;传统的键盘、鼠标等输入设备已经不能满足人们对自然、直观交互的需求。手势识别作为一种非接触式的人机交互方式&#xff0c;具有操作自然、交互直观的特点&#xff0c;在智能家居、游戏控制、虚拟现实等领域…...

上海SMT贴片加工核心工艺与优化方案

内容概要 作为电子制造领域的核心环节&#xff0c;上海SMT贴片加工技术通过精密工艺实现元器件的高效贴装与可靠焊接。本文聚焦钢网印刷、回流焊、AOI检测等关键工艺节点&#xff0c;结合物料定位误差修正与BGA缺陷预防&#xff0c;系统阐述技术优化路径。同时&#xff0c;基于…...

RK3xxx 部分无法连接虚拟机 无法进行adb连接

我发现部分rk板子可以连接到虚拟机上&#xff0c;部分连接不上。其中尝试了一块是安卓系统的rk板子是可以连接虚拟机。但是用了linux系统的rk板子连接不上虚拟机。尝试了很多办法还是无法连接虚拟机。 然后也看到一些相关资料&#xff0c;但是太少了&#xff0c;只有这个链接提…...

Kohya-ss-gui v25.0.3 训练Flux.1 大模型命令参数

Kohya-ss-gui v25.0.3 训练Flux.1 大模型命令参数 本文是博主的训练笔记&#xff0c;这篇是记录训练Flux.1大模型的命令行参数&#xff1a; 数据结构 /app/data/Flux大模型/train/img . └── 10_skm qili├── 10x4096_4096x4096_flux.npz├── 10x4096.jpg├── 10x4096…...

26考研——存储系统(3)

408答疑 文章目录 一、存储器概述二、主存储器三、主存储器与 CPU 的连接四、外部存储器五、高速缓冲存储器六、虚拟存储器七、参考资料鲍鱼科技课件26王道考研书 八、总结复习提示思考题常见问题和易混淆知识点 一、存储器概述 文章链接: 点击跳转 二、主存储器 文章链接: …...

【prompt是什么?有哪些技巧?】

Prompt&#xff08;提示词&#xff09;是什么&#xff1f; Prompt 是用户输入给AI模型&#xff08;如ChatGPT、GPT-4等&#xff09;的指令或问题&#xff0c;用于引导模型生成符合预期的回答。它的质量直接影响AI的输出效果。 Prompt 的核心技巧 1. 明确目标&#xff08;Clar…...

Yocto meta-toradex-security layer 创建独立数据分区

By Toradex 胡珊逢 简介 Toradex 为其产品使用的软件系统如 Linux 提供了诸多的安全功能&#xff0c;例如 Secure Boot、分区加密、OP-TEE 等&#xff0c;帮助用户应对安全合规。这些功能可以通过在 Yocto Project 中添加由 Toradex 开发的 meta-toradex-securitylayer 被轻松…...

MQTT学习资源

MQTT入门&#xff1a;强烈推荐...

C# 实战_RichTextBox选中某一行条目高亮,离开恢复

C# 中控件richtextbox中某一行的条目内容高亮&#xff0c;未选中保持不变。当鼠标点击某一行的条目高亮&#xff0c;离开该条目就恢复默认颜色。 运行效果&#xff1a; 核心代码实现功能&#xff1a; //高亮指定行的方法private void HighlightLine(RichTextBox rtb,int lineI…...

深度解析:从12306看混合云架构下的高并发系统设计

作为曾参与12306余票查询系统高并发升级的技术从业者&#xff0c;笔者注意到公众对于12306底层技术常存在认知盲区。为破解这一迷思&#xff0c;特此分享十年前的架构解密文献&#xff08;该技术之前名叫 gemfire 现已晋升为Apache顶级项目Geode&#xff0c;代码库详见&#xf…...

分布式队列对消息语义的处理

在分布式系统中&#xff0c;消息的处理语义&#xff08;Message Processing Semantics&#xff09;是确保系统可靠性和一致性的关键。有三种语义&#xff1a; 在分布式系统中&#xff0c;消息的处理语义&#xff08;Message Processing Semantics&#xff09;是确保系统可靠性和…...

Servlet小结

视频链接&#xff1a;黑马servlet视频全套视频教程&#xff0c;快速入门servlet原理servlet实战 什么是Servlet&#xff1f; 菜鸟教程&#xff1a;Java Servlet servlet&#xff1a; server applet Servlet是一个运行在Web服务器&#xff08;如Tomcat、Jetty&#xff09;或应用…...

2025上海车展:光峰科技全球首发“灵境”智能车载光学系统

当AI为光赋予思想&#xff0c;汽车将会变成什么样&#xff1f;深圳光峰科技为您揭晓答案。 2025年4月23日&#xff0c;在刚刚开幕的“2025上海车展”上&#xff0c;全球领先的激光核心器件公司光峰科技举办了主题为“AI光影盛宴&#xff0c;智享未来出行”的媒体发布会&#x…...

BiliNote:开源的AI视频笔记生成工具,让知识提取与分享更高效——跨平台自动生成结构化笔记,实现从视频到Markdown的智能转化

引言:视频学习的痛点与BiliNote的解决方案 随着知识视频化趋势的加速,B站、YouTube等平台成为学习与信息获取的重要渠道,但手动记录笔记耗时低效、信息碎片化等问题依然突出。BiliNote的出现,通过AI驱动的自动化流程,将视频内容转化为结构清晰的Markdown笔记,支持截图插…...

docker 运行时权限和 Linux 能力了解

文档参考&#xff1a; https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities https://docs.docker.com/reference/cli/docker/container/run/#privileged 本片主要了解容器在运行时如何赋予的格外的权限&#xff0c;默认情况下&#xff0…...

图纸安全防护管理:构建企业核心竞争力的关键屏障

在当今高度竞争的商业环境中&#xff0c;图纸作为企业核心技术的重要载体&#xff0c;其安全防护管理已成为企业知识产权保护体系中的关键环节。无论是建筑行业的施工蓝图、制造业的产品设计图&#xff0c;还是高科技企业的研发图纸&#xff0c;都承载着企业的核心竞争力和商业…...

如何用WordPress AI插件自动生成SEO文章,提升网站流量?

1. 为什么你需要一个WordPress AI文章生成插件&#xff1f; 每天手动写文章太耗时&#xff1f;SEO优化总是不达标&#xff1f;WordPress AI插件能帮你24小时自动生成原创内容&#xff0c;从关键词挖掘到智能排版&#xff0c;全程无需人工干预。 痛点&#xff1a;手动写作效率低…...

借助内核逻辑锁pagecache到内存

一、背景 内存管理是一个永恒的主题&#xff0c;尤其在内存紧张触发内存回收的时候。系统在通过磁盘获取磁盘上的文件的内容时&#xff0c;若不开启O_DIRECT方式进行读写&#xff0c;磁盘上的任何东西都会被缓存到系统里&#xff0c;我们称之为page cache。可以想象&#xff0…...

Nacos简介—2.Nacos的原理简介

大纲 1.Nacos集群模式的数据写入存储与读取问题 2.基于Distro协议在启动后的运行规则 3.基于Distro协议在处理服务实例注册时的写路由 4.由于写路由造成的数据分片以及随机读问题 5.写路由 数据分区 读路由的CP方案分析 6.基于Distro协议的定时同步机制 7.基于Distro协…...

【信息系统项目管理师】高分论文:论人力资源管理与成本管理(医院信息系统)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、规划人力资源管理二、组建项目团队三、建设项目团队四、管理项目团队论文 一个完善的医院信息系统通常由上百个子系统构成,而这些系统随着医院发展需求逐步建设的,他们来源于不同厂家,基于不同的技…...

Docker Compose和 Kubernetes(k8s)区别

Docker Compose 和 Kubernetes&#xff08;k8s&#xff09;是两种不同层次的容器编排工具&#xff0c;主要区别体现在设计目标、使用场景和功能特性上。以下是它们的核心对比&#xff1a; 1. 设计目标 Docker Compose 单机编排&#xff1a;专注于在单个主机上定义和运行多容器应…...

IP查询专业版:支持IPv4/IPv6自动识别并切换解析的API接口使用指南

以下是根据您提供的网页内容编辑的符合CSDN内容发布要求的Markdown格式文本&#xff1a; 一、API概述 在开发过程中&#xff0c;我们常常需要对IP地址进行查询&#xff0c;以获取其详细信息&#xff0c;如地理位置、运营商等。万维易源的“IP查询专业版”API接口能够提供丰富…...