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

springboot redisson 分布式锁切面入门与实战

Spring Boot3 Redisson 项目地址

https://gitee.com/supervol/loong-springboot-study

(记得给个start,感谢)

分布式锁介绍

        在分布式系统中,多个服务实例(节点)可能同时操作共享资源(如数据库记录、缓存数据等),此时本地锁(如synchronizedReentrantLock)无法跨节点生效,会导致并发安全问题(如超卖、数据不一致)。分布式锁正是为解决这类问题而生 —— 它是一种跨节点的互斥机制,确保同一时间只有一个节点能操作共享资源。

        实现分布式锁需满足以下关键特性:

  1. 互斥性:同一时间只能有一个节点持有锁。
  2. 安全性:避免死锁(如锁超时自动释放),防止误释放他人的锁。
  3. 可用性:锁服务需高可用,避免单点故障。
  4. 重入性:同一节点的同一线程可重复获取已持有的锁(可选,视场景而定)。
  5. 公平性:按请求顺序获取锁(可选)。

Redisson 分布式锁简介

        Redisson 是基于 Redis 的 Java 客户端,提供了丰富的分布式数据结构(包括分布式锁),其实现的分布式锁具有以下核心特性:

  • 可重入性:同一线程可多次获取同一把锁,避免自死锁
  • 自动续期:通过 "看门狗" 机制,在业务未完成时自动延长锁的过期时间,防止锁提前释放
  • 公平 / 非公平锁:支持公平锁(按请求顺序获取)和非公平锁(默认)
  • 红锁(RedLock):针对 Redis 集群,通过多个实例加锁提高可靠性
  • 自动释放:支持设置过期时间,避免死锁

Redisson 分布式锁切面示例

        请参考项目地址中 springboot-aop/springboot-redisson-lock 模块代码。

注意事项

  1. 锁的命名规范:锁名需唯一标识共享资源(如业务:资源类型:唯一ID),避免不同业务共用同一把锁。
  2. 释放锁的正确性:必须在finally中释放锁,且释放前需通过isHeldByCurrentThread()判断是否持有锁,避免释放其他线程的锁。
  3. 过期时间设置
    • 若使用lock()(无过期时间),依赖看门狗自动续期(默认 30 秒,每 10 秒续期一次),适合业务耗时不确定的场景。
    • 若使用lock(leaseTime, unit),需确保leaseTime大于业务最大耗时,否则锁会提前释放。
  4. 红锁(RedLock):在 Redis 集群环境(多主节点)中,可使用红锁提高可靠性(需操作多个独立 Redis 实例):
    RLock lock1 = redissonClient1.getLock(lockKey);
    RLock lock2 = redissonClient2.getLock(lockKey);
    RLock lock3 = redissonClient3.getLock(lockKey);RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
    redLock.lock(10, TimeUnit.SECONDS); // 红锁加锁
    

  5. 性能考量:分布式锁会引入网络开销,避免过度使用;非核心业务可考虑最终一致性方案。
  6. 异常处理:切面中已通过finally确保锁释放,但业务方法抛出异常时需自行处理(如事务回滚)。

总结

        通过 AOP 切面 + 自定义注解,Redisson 分布式锁的使用变得极为简洁:只需在方法上添加注解,即可实现分布式并发控制。这种方式既减少了重复代码,又统一了锁的管理逻辑,非常适合在 Spring Boot 3 项目中大规模使用。额外注意数据库事务需要特殊处理。

http://www.dtcms.com/a/363380.html

相关文章:

  • HTML应用指南:利用POST请求获取全国便利蜂门店位置信息
  • 面试tips--JVM(4)--Minor GC Major GC Full GC
  • 从理念到实践:三层解耦架构与“无系统”论
  • 59.螺旋矩阵II
  • 科研界“外挂”诞生了:科学多模态模型Intern-S1-mini开源
  • linux开发板(rk3568,树莓派)自动连接保存好的WIFI
  • 百度网盘基于Flink的实时计算实践
  • SpringMVC —— Spring集成web环境和SpringMVC快速入门
  • 微信小程序列表之分页、刷新、加载更多开发
  • [密码学实战]逆向工程常见工具合集及下载地址(四十七)
  • 顶级天才会思考什么问题
  • Unity切换平台资源重新编译缓慢
  • 嵌入式git分支管理策略
  • 江协科技STM32学习笔记补充之002 对比介绍 I²C 和 SPI 两种常见的串行总线接口
  • Linux 环境配置 Boost 库详细步骤
  • C++二维数组的前缀和
  • 高德开放平台智能眼镜解决方案,Rokid Glasses AR导航实测
  • 相较于传统AR矿物鉴定有哪些优势?
  • AR技术赋能风电运维:精准、高效、智能
  • Android 16k页面大小适配
  • 抄苹果作业,安卓「无视风险,继续安装」要被谷歌砍了?
  • ADB图片上传轮播
  • 2022版Unity创建时没有2D灯光(2D Light),没有Global LIght2D怎么办?
  • MYSQL 认识事务
  • Python实现多线程PDF抓取与下载脚本
  • 每秒扛住10万请求?RedissonRateLimiter 分布式限流器详解
  • 【机器学习深度学习】向量检索到重排序:RAG 系统中的优化实践
  • 好消息:Oracle 23ai 现已支持一键部署!
  • ThinkPHP的log
  • 使用 C 模仿 C++ 模板的拙劣方法