通过切面类对方法添加分布式redis锁demo

京东秒杀系统模块的Redis分布式锁深度剖析,没给你讲明白你打我! 1|0背景 目前开发过程中,按照公司规范,需要依赖框架中的缓存组件。不得不说,做组件的大牛对CRUD操作的封装,连接池、缓存路由、缓存安全性的管控都处理的无可挑剔。但是有一个小问题,该组件没有对分布式锁做实现,那就要想办法依靠缓存组件自己去实现一个分布式锁了。 什么,为啥要自己实现?有现成的开源组件直接拿过来用不就行了,比如Spring-Integration-Redis提供RedisLockRegistry,Redisson,不比自己去实现快的多。那我得声明一下,本人也不喜欢重复造轮子。具体原因呢,首 阅读详情

1、创建注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface RedisLock {
    /** 活动key */
    String activityKey() default "";

    /** 锁存储字符串 */
    String valueStr() default "1";

    /** 有效期,默认1 */
    long timeout() default 1;

    /** 有效期单位,默认秒 */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /** 是否在方法执行完成后删除 */
    boolean overDel() default true;
}

2、创建切面类

/**
 * 使用redis锁注解对方法加锁
 * @author lei.yan004
 */
@Component
@Aspect
public class RedisLockAspect {

    private static final Logger logger = LoggerFactory.getLogger(RedisLockAspect.class);

    @Autowired
    private RedisUtil redisUtil;

    // 声明公共切入点
    @Pointcut("@annotation(com.sinolife.lock.RedisLock)")
    private void lockPointCut() {
    }

    /**
     * 方法执行前调用,用于请求加锁
     * @param joinPoint
     * @return
     */
    @Around(value = "lockPointCut()")
    public Object lockAround(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        RedisLock annotation = method.getAnnotation(RedisLock.class);

        String userId = PlatformContext.currentUser();
        if (StringUtil.isDataEmpty(userId)) {
            return ResponseResult.fail("登陆超时,请重新登陆");
        }
        String redisKey = RedisKeyConstant.REDIS_KEY_PUB_LIMIT ;
        if(StringUtils.isNotBlank(annotation.activityKey())){
            redisKey += annotation.activityKey() + ":" ;
        }
        redisKey += method.getName() + ":" + userId;
        boolean setResult = redisUtil.setIfAbsent(redisKey, annotation.valueStr(), annotation.timeout(), annotation.timeUnit());
        if (!setResult) {
            return ResponseResult.fail("正在处理中,请勿重复操作");
        }
        return joinPoint.proceed();
    }

    /**
     * 方法执行完成后调用,用于释放锁
     * @param joinPoint
     * @return
     * @Author lei.yan004
     */
    @After("lockPointCut()")
    public void lockAfter(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        RedisLock annotation = method.getAnnotation(RedisLock.class);
        if (annotation.overDel()) {
            String userId = PlatformContext.currentUser();
            String redisKey = RedisKeyConstant.REDIS_KEY_PUB_LIMIT;
            if (StringUtils.isNotBlank(annotation.activityKey())) {
                redisKey += annotation.activityKey() + ":";
            }
            redisKey += method.getName() + ":" + userId;
            redisUtil.delete(redisKey);
        }
    }
}

3、使用demo

可以通过RedisLock注解的属性,进行一些自定义的配置,例如有效期等

@RedisLock
@RequestMapping("/updateScene")
public ResponseResult<Map<String,Object>> updateScene() {
	...
}
SpringBoot中通过自定义缓存注解(AOP切面拦截)实现数据库数据缓存到Redis 场景 若依前后端分离版本地搭建开发环境并运行项目的教程: https://blog.youkuaiyun.com/BADAO_LIUMANG_QIZHI/article/details/108465662 基于上面搭建起来前后端分离的Vue+SpringBoot的项目。 其中数据库使用的是Mysql,缓存层用的是Redis。 数据库中某个表存储的信息,在业务代码比如定时任务中,需要频繁的查询。 所以将表中的数据存储到redis中一份。 其原理是,在调用查询方法时,判断redis中是否已经有,如果有则优先从 阅读详情

相关推荐

springboot实现消息转换、切面AOP和Redis缓存

springboot实现消息转换、切面AOP和Redis缓存,实现相关技术的实例,以及相关方法的使用说明

使用redis+切面完成分布式锁

近日在项目上,需要用到分布式锁,那肯定redis实现了,后来一想干脆写个切面吧,后期方便使用,于是查看了很多文章,然后照猫画虎的实现了,废话不多说,直接上代码! maven使用包 <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> </depende

weixin_41036287的博客 1703

Transformer是什么?看完这篇你就醍醐灌顶

前言 由谷歌团队提出的预训练语言模型BERT近年来正在各大自然语言处理任务中屠榜(话说学者们也挺有意思的,模型名都强行凑个芝麻街的人物名,哈哈哈)。 BERT算法的最重要的部分便是Transformer的概念,它本质上是Transformer的编码器部分。 而Transformer是什么呢?transformer是永远的神,自从transformer使用了抛弃rnncnn的纯attention机制之后,各种基于transformer结构的预训练模型都如雨后春笋般雄起,而transformer中最重要就是使用

fs1341825137的博客 6万+

自定义Redis注解及切面导入

1.切面类 @Aspect @Component public class DelRedisAspect { public static final Logger logger = LoggerFactory.getLogger(DelRedisAspect.class); @Autowired RedisClient redisClient; /** ...

mayongbo19的博客 587

IEC103协议实战指南:报文解析与传输优化策略

本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。

r2s3t4的博客 541

深度学习笔记(3)——kernel(内核)与filter(滤波器)

本文仅仅简单介绍了kernel和filter的概念,介绍了确定filter和kernel个数的方法。

cs111211的博客 7137

AOP注解方式实现redis分布式抢占锁

很多项目中都会有一些需要做定时跑批的任务需求,大多数是通过spring注解的方式实现的,但是到了生产环境,多节点的部署可能会造成定时任务的多节点同时触发而可能会出现脏数据。之前的处理方案是通过在字典里配置指定生产节点处理定时任务。虽然此方法也能实现需求,但总觉得很low,所以自己就通过JAVA的AOP方式利用redis实现了一套分布式抢占锁,通过注解的方式解决生产环境多节点部署带来的定时任务触发。

qrainly的博客 802

【Unity 城市建模插件】POLY-Megapolis City Pack 提供超过数百种城市建筑、道路、车辆与城市家具模型,完美适用于构建现代化城市、模拟城市游戏、都市题材冒险类游戏和开放世界项目

POLY - Megapolis City Pack 是一套风格统一、内容丰富的低多边形城市建模资源包,专为 Unity 引擎设计。该资源包提供超过数百种城市建筑、道路、车辆与城市家具模型,完美适用于构建现代化城市、模拟城市游戏、都市题材冒险类游戏和开放世界项目。无论是快速原型开发还是正式发布项目,POLY 系列都能提供高效、风格统一的解决方案。

2403_88403568的博客 635

redis实现分布式限流 结合Lua脚本

通过 AOP 结合 Redis + Lua 脚本实现分布式限流,旨在保护 API 被恶意频繁访问的问题 自定义注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RateLimiter { long DEFAULT_REQUEST = 10; /** * max 最大请求数 */ @AliasFor("max").

你走过的路 风都是暖的 707

【人工智能 Open AI】程序员怎样提升研发效率?从技术、业务、项目管理等等多个方面来阐述。

程序员要想提升研发效率,需要从技术、业务、项目管理等多方面着手,多靠工具配合实践实现,从而提升研发效率。

AI天才研究院 5526

【YOLOv8改进 - 注意力机制】GAM(Global Attention Mechanism):全局注意力机制,减少信息损失并放大全局维度交互特征

为了提高各种计算机视觉任务的性能,研究了多种注意力机制。然而,现有方法忽视了保留通道和空间两个方面信息的重要性,以增强跨维度的交互。因此,我们提出了一种全局注意力机制,通过减少信息损失和放大全局交互表示来提升深度神经网络的性能。我们引入了带有多层感知器的3D排列用于通道注意力,同时结合了卷积空间注意力子模块。在CIFAR-100和ImageNet-1K上的图像分类任务评估中,表明我们的方法在ResNet和轻量级MobileNet上稳定地优于几种最新的注意力机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1158

AOP+自定义注解+Redis实现分布式缓存

AOP+自定义注解+Redis实现分布式缓存

小学生波波 1687

黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

本文由黑猫学长撰写,深入解析UFS协议,覆盖从基础概念到高级特性的全方位教程。适合存储芯片行业从业者和嵌入式开发者,旨在帮助读者快速掌握UFS协议,适用于高端智能手机、平板等智能设备。预计15万字,涵盖UFS 3.1协议,讲解UFS协议栈、物理层、链路层、传输层等内容。

黑猫奥利奥的博客 3696

redis:使用AOP和lua实现分布式限流

!!! 这个是 原文链接按照原文链接操作了下,发现最后有报错,原先以为是lua脚本的问题,后来查了半天是redisTemplate序列化的问题,记录一下 注解 切面类 枚举类-ip还是自定义限流 异常类 controller接口 注意:注解要加在方法上,不然不生效 问题 如果上述操作完后,启动运行报错, 要对redis添加序列化设置 测试 使用apipost调用1次: 使用apipost并发调用3次:

qq_41364834的博客 404

第 5 篇:责任链模式 (Chain of Responsibility) —— 协议栈的流水线

本文介绍了责任链模式在嵌入式通信协议解析中的应用。针对传统"面条式"代码维护困难的问题,提出将各协议解析器解耦为独立处理单元,通过链表形式串联。文章详细展示了模式实现:定义抽象处理者接口、实现具体协议处理器、构建链表管理器。该方案具有内存占用低(O(1)栈空间)、可动态扩展、支持优先级调整等优势,并探讨了性能优化策略及动态插件系统等扩展应用,为嵌入式通信协议处理提供了清晰的架构方案。

一路往蓝-Anbo 的博客 177

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基于redis的分布式session实现

一、原理讲解 基于redis的分布式session实现,依赖于前台请求中携带的cookie和后台生成的token。大致原理可以分为以下步骤: 1,前端请求目标方法,拦截器判断请求头中是否携带cookie。 2,如果请求头中携...

348

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SpringBoot与Redisson整合,用注解方式解决分布式锁的使用问题

Redisson 是一个基于 Redis 的 Java 客户端,提供了丰富的分布式锁功能,如红锁(Red Lock)、公平锁、可重入锁等。Redisson 的设计使得开发者可以非常方便地在 Spring Boot 项目中集成这些功能,而不需要深入了解底层的实现细节。特点支持多种类型的分布式锁。内置了读写锁、信号量等功能。提供了简单的 API 和强大的容错机制。可以通过注解的方式简化锁的使用。常见应...

qq_18244417的博客 471

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Spring】Spring 循环依赖的一个案例

此 demo 主要演示了 Spring Boot 项目如何通过 AOP 结合 Redis + Lua 脚本实现分布式限流,旨在保护 API 被恶意频繁访问的问题,是 spring-boot-demo-ratelimit-guava 的升级版。切面类RedisRateLimiterAspect。这里出现了循环依赖值得注意一下。

九师兄 116

武功秘籍之限流

武功秘籍之限流目录单机限流动态单机限流分布式限流 目录 “ 什么是限流?为什么要做限流?各个场景下限流功能是如何实现的?” 单机限流 限流: 在高并发环境下,往往一个服务会有多个业务方调用,不同的业务方请求频次不一样,业务重要程度也不一样,所以在设计分布式服务架构中,需要增加限流模块来保证核心主要服务的稳定性,本文主要介绍三种常用的限流方案,适合不同的应用场景。 场景描述: 对于大部分单实例或者几个实例的应用,服务可以采用单机限流的方式,在后端代码中设置固定的值,针对后端指定接口限制每秒或者每小时进行请求总

码农周星星 339

Spring Boot防误触设计实战:基于Token二次确认与AOP审计日志

在软件工程实践中,系统容错设计和人机交互安全是保障服务稳定性的关键环节。其核心原理在于通过架构层面的预防机制,降低因人为误操作引发生产事故的风险,这对于提升软件系统的鲁棒性具有重要价值。在涉及数据删除、服务下线等高危操作的场景中,仅依赖前端确认弹窗存在被绕过或上下文缺失的隐患。因此,服务端需要构建贯穿操作前、中、后的立体防护体系,例如实现基于Token的二次确认机制来确保操作意图明确,并结合面向切面编程(AOP)技术实现全链路的操作审计日志,确保所有关键操作可追溯、可复盘。本文聚焦于后端开发,通过一个完整的

weixin_30635053的博客 339

OpenTracing API 自动埋点调研

一 基本术语 Trace : 表示系统中一次数据或者执行路径的轨迹,可以简单认为是多个Span有向无环图。 Span:Span代表系统中一次逻辑操作运行单元。Span之间会简历嵌套或者顺序排列建立逻辑因果关系 二 组件架构 无缓存队列的架构 有缓存队列架构 三 服务追踪 服务追踪过程 四 应用埋点 1 手动埋点工具Client 针对非java应...

hanjiangxue1006的博客 4489

从CRUD到系统架构师:构建技术内功的四大心法与实战路径

在软件开发领域,深入理解计算机系统原理是构建高性能、高可靠系统的基石。从进程线程调度、内存管理到I/O模型与网络协议栈,这些底层知识构成了复杂分布式系统的支撑框架。掌握这些原理不仅能帮助开发者快速定位线上问题的根本原因,更能从架构层面设计出优雅的解决方案。在微服务和云原生架构日益普及的当下,对JVM运行时机制、TCP拥塞控制等核心概念的深刻理解,成为应对高并发场景、保障系统稳定性的关键技术能力。本文通过系统化的思维模型构建、可调试的实践方法,结合具体案例,展示了如何将理论知识转化为解决实际工程问题的直觉,特

weixin_34416649的博客 334

Qwen3.7-Max Agent架构解析:Planning Head与State Refiner如何实现工程级可靠性

Agent(智能体)是大模型落地的关键范式,其核心挑战在于规划可预测性、工具调用准确性与状态一致性。Qwen3.7-Max通过显式解耦的Planning Head实现确定性路径生成,规避传统LLM概率采样导致的步骤混乱;借助轻量State Refiner模块,在不扩大上下文窗口的前提下完成跨轮次结构化状态建模,显著提升语义锚定能力。这种‘模块化+可观测’设计,使Agent从Demo级演示迈向生产可用——尤其适用于专利分析、AI编程辅助、企业级RAG编排等对稳定性与可审计性要求严苛的场景。本文聚焦其三大重构模

weixin_34289454的博客 339

SpringBoot AOP切面 + Redis 身份验证

一个成熟的项目中,如果有些方法是对登录身份有所限制的话,我们往往回去验证一下用户的身份,方法很简单,就是从Cookie里取出我们的身份信息,再判断是否有效 我们这里使用的身份验证工具时 Redis,我们在用户登录时为用户生成一个 token,把 token 放进 Cookie 传到前端的同时也在Redis 里保存 token 1.创建一个 Redis 用的属性类,如有效期,前缀等 /** ...

LinzhiQQQ的博客 855

JAVA开发(通过AOP切面方式管理redis缓存)

在调用查询方法时,判断redis中是否已经有,如果有则优先从redis中查询。 如果没有则在数据库中查询后并存入到Redis中一份,并给其设置过期时间。 这样在过期时间之内,查询数据会从redis中查询,过期之后会重新从数据库中查询并存入到Redis一份。再对这个数据库表进行新增、编辑、删除的操作时,将redis中存储的数据。 进行删除,这样下次查询就会查询数据库中最新的。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 960
上一篇: (六)SpringCloud-OpenFeign服务调用
下一篇: MongoDB
村口老师傅
博客等级 码龄9年 67粉丝 107原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值