SpringBoot AOP + Redis延时双删功能

延时双删功能就不过多解释了,场景就是,为了少关联表,将数据的id 跟name存到redis中,但是为了解决数据一致性的问题,即一旦name修改了,如何更新redis,写了如下代码,部分参考了其他人的代码。

此代码实现了 将注解放到任意方法,都可以获取该方法的参数值,但是限制条件是,方法参数必须是对象,必须含有id属性(其实你可以根据自己的情况改我的代码,毕竟是个工具类)。

注解代码:

import java.lang.annotation.*;/*** 延时双删缓存* @ClassName ClearAndReloadCache.java* @author Vico* @version 1.0.0* @createTime 2024/6/26 上午11:17*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.METHOD)
public @interface ClearAndReloadCache {
}

切面代码:

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.lang.reflect.Method;/*** 延时双删切面** @author Vico* @version 1.0.0* @ClassName ClearAndReloadCacheAspect.java* @createTime 2024/6/26 上午11:19*/
@Slf4j
@Aspect
@Component
public class ClearAndReloadCacheAspect {@Resourceprivate StringRedisTemplate stringRedisTemplate;/*** 切入点* 切入点,基于注解实现的切入点  加上该注解的都是Aop切面的切入点*/@Pointcut("@annotation(com.rms.common.annotation.ClearAndReloadCache)")public void pointCut() {}/*** 环绕通知** @param proceedingJoinPoint*/@Around("pointCut()")public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {Signature signature1 = proceedingJoinPoint.getSignature();// 获取方法签名MethodSignature methodSignature = (MethodSignature) signature1;// 获取方法参数类型Class<?> parameterTypes = methodSignature.getMethod().getParameterTypes()[0];// 获取方法参数值Object arg = proceedingJoinPoint.getArgs()[0];String id = null;try {Method getIdMethod = parameterTypes.getMethod("getId");id = (String) getIdMethod.invoke(arg);log.info("开始删除缓存的id-name:{}", id);//模糊删除redis的key值stringRedisTemplate.delete(id);} catch (Exception e) {e.printStackTrace();}Object proceed = null;try {proceed = proceedingJoinPoint.proceed();} catch (Throwable throwable) {throwable.printStackTrace();}// 在线程中延迟删除  同时将业务代码的结果返回 这样不影响业务代码的执行String finalId = id;new Thread(() -> {try {Thread.sleep(5000);stringRedisTemplate.delete(String.valueOf(finalId));log.info("-----------1秒钟后,在线程中延迟删除完毕 -----------");} catch (InterruptedException e) {e.printStackTrace();}}).start();//返回业务代码的值return proceed;}
}

使用示例:

@ClearAndReloadCachepublic AjaxResult edit(@RequestBody MProjectSite mProjectSite){return toAjax(mProjectSiteService.updateMProjectSite(mProjectSite));}

所以一般是使用在 controller 层的编辑方法上,编辑时删除缓存,配合其他工具类 等下次触发查询发现缓存没了 再重新从数据库查询缓存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAG应用要如何吃到大模型长上下文的红利?-LongRAG

去年底的时候&#xff0c;笔者写过&#xff0c;与其在RAG系统上雕花&#xff0c;可以重新思考一下&#xff0c;自己的业务场景是否非RAG不可吗&#xff1f;随着去年大模型的蓬勃发展&#xff0c;长度外推、更长的上下文模型&#xff0c;更厉害的中文底座大模型&#xff0c;都可…

RabbitMq camel

真实的项目如果 交换器/ 队列很多 建议在管理页面新建exchange / queue/ rootingKey /vhost, 而不要写死在springboot项目里 camel按rooting key发送消息: 最推荐 .to("rabbitmq:sino.nannan?routingKeysino.key&skipExchangeDeclaretrue&skipQueueDeclaretru…

Python 挖坑式填充Excel模板内容(包括页眉/SheetName/logo)

纵览 Python处理Excel的方式--解压缩方式1、导包2、对模板文件进行解压缩3、对解压缩后文件层级进行介绍4、准备需要载入的数据5、模板挖坑6、运行替换代码7、压缩文件8、生成文件9、完成代码10、可能遇到的问题 结语 Python处理Excel的方式–解压缩方式 在处理Excel中过程中&…

《人人都是产品经理》:项目的坎坷一生

《人人都是产品经理》&#xff1a;项目的坎坷一生 产品VS项目产品经理和项目经理 一切项目从kick off 开始工作量预估Kick Off的大致也就15分钟 写文档咯UML图用例文档UCdemo也得做 需求活在项目中bug等级有多高bug流转过程 以终为始 产品VS项目 项目定义&#xff1a;是只会进…

navict sql 复制出来 带逗号分隔的,如:(1, 2, 3, 4, 5)

1. 假如我们要查询一个表中所有的id, 拼接成括号逗号分隔形式 select id from student1 2 3 4 5 2. 解决办法&#xff1a;使用函数创建一个对应的函数 如下是sql代码&#xff1a; # 删除函数 drop FUNCTION if EXISTS sm; # 创建函数 CREATE FUNCTION sm(s TEXT) RETURNS …

怎么压缩pdf文件大小,如何压缩pdf文件大小

pdf文件怎么压缩&#xff1f;在当下这个信息爆炸的时代&#xff0c;无论是在工作场所还是校园中&#xff0c;我们经常会面临需要处理大文件的情况&#xff0c;而PDF格式作为一种保留文档结构和布局完整性的理想选择&#xff0c;有时候pdf文件太大&#xff0c;因此&#xff0c;对…

【vdbench性能测试】Slaver连Master显示连接超时,大概率etc/hosts文件出问题

报错类似&#xff1a; slavejvm execution parameter: -m 127.0.1.1 slavejvm execution parameter: -n xx.xx.xx.xx-11-240626-15.21.50.164 slavejvm execution parameter: -l hd2-0 15:21:50.833 15:21:50.832 slavejvm execution parameter: -p 5570 slavejvm positio…

typec密封胶防水用什么胶好?

typec密封胶防水用什么胶好&#xff1f; 对于Type-C连接器的防水密封&#xff0c;行业内普遍推荐使用单组份环氧型热固化胶。这种胶水具有以下优点&#xff0c;使其成为Type-C防水密封的理想选择&#xff1a; 粘稠度易于调整&#xff1a;这有助于胶水在点胶过程中更好地渗透到T…

基于深度学习的点云包围盒检测

基于深度学习的点云包围盒检测 点云包围盒检测是一项关键任务&#xff0c;主要用于三维场景中物体的检测和定位。与传统的二维图像目标检测不同&#xff0c;点云数据包含了三维空间的信息&#xff0c;能够提供更加丰富的细节和准确的位置。基于深度学习的方法在点云包围盒检测…

2024年二级建造师机电工程专业考试题库分享。

1.调查表法通常与&#xff08;&#xff09;结合使用&#xff0c;以便更快地发现问题原因。 A.经验法 B.分层法 C.样本调查法 D.对比分析法 答案&#xff1a;B 解析&#xff1a;题干内容提示调查表法往往会与分层法结合起来应用&#xff0c;故B选项正确。 2.在质量统计分…

nestjs从零到一,快速上手(七) 拦截器的使用

演示代码&#xff1a; 1. logs.controller.ts import { Body, Controller, Post, UseInterceptors } from nestjs/common; import { IsNotEmpty, IsString } from class-validator; import { SerializeInterceptor } from ../interceptors/serialize/serialize.interceptor; …

压缩图片png格式该怎么操作?试试下面这3个图片压缩工具吧

png是经常用于储存图片的一种格式&#xff0c;随着现在图片在日常工作和生活中的广泛使用&#xff0c;在很多的使用场景中都有应用。png的图片质量高而且支持无损压缩&#xff0c;在缩小图片的时候不会因为压缩而影响图片的清晰度&#xff0c;更适合在网上的存储、分享或者传输…

论文阅读MVBench: A Comprehensive Multi-modal Video Understanding Benchmark

摘要(Abstract)&#xff1a; 论文介绍了MVBench&#xff0c;这是一个全新的多模态视频理解基准测试&#xff0c;旨在评估多模态大型语言模型&#xff08;MLLMs&#xff09;在视频理解方面的能力。 目前许多基准测试主要集中在静态图像任务的空间理解上&#xff0c;而忽视了动…

c++进程间通信--zeromq

ZeroMQ&#xff08;也写作 MQ、0MQ 或 zmq&#xff09;是一个高性能的异步消息队列库&#xff0c;提供了一种灵活的方式来实现进程间通信&#xff08;IPC&#xff09;以及网络通信。在C中使用ZeroMQ进行进程间通信非常直观和高效。zmq的通信模式如下&#xff1a; 下面先说明请求…

保护你的代码堡垒:精通npm audit命令

保护你的代码堡垒&#xff1a;精通npm audit命令 在当今快速发展的软件开发领域&#xff0c;安全漏洞如同暗夜中的刺客&#xff0c;随时可能对我们的应用程序发起致命一击。幸运的是&#xff0c;npm提供了一个强大的安全审计工具——npm audit命令&#xff0c;它能帮我们检测和…

第 11 课:组件介绍与自定义开发

本讲主要介绍了隐语的组件标准、已有的组件能力以及进一步的自定义开发流程。经过本讲的学习&#xff0c;可以为将隐语集成到任意调度系统&#xff0c;基于Kusica/SecretPad进行二次开发&#xff0c;以及参与隐语开放标准共建建立基础。 一、隐语开放标准 隐语提出的适用于隐私…

2024.06.26【读书笔记】|医疗科技创新流程(前言)【AI增强版】

目录 《BIODESIGN》第二版前言详细总结前言概述新增重要内容价值导向 (Value Orientation)全球视角 (Global Perspectives)更好的教学和学习方法 (Better Ways to Teach and Learn)全新视频集合 (New Videos)扩展的“实地”案例研究 (Expanded “From the Field” Case Studies…

产品3D展示有哪些优势?3D能替代2D展示吗?

随着科技的飞速发展和经济的持续增长&#xff0c;我们见证了一个从2D到3D的产品展示革命。与传统的2D图片展示相比&#xff0c;3D产品展示正以其独特的优势逐渐崭露头角。 一、3D产品展示的独特优势 1、更逼真的视觉效果&#xff1a; 3D展示技术能够以更为真实、立体的方式展…

证件照制作工具有哪些?这6个帮你自制证件照

许多人可能认为&#xff0c;制作一张符合标准要求的证件照&#xff0c;必须亲自前往照相馆。 然而&#xff0c;事实上&#xff0c;我们完全可以使用手机或电脑上的证件照制作app&#xff0c;自己轻松完成证件照的制作。无论是更换背景颜色&#xff0c;还是调整照片尺寸&#x…

qt qml-http之XMLHttpRequest介绍详解使用

文章目录 QML中的XMLHttpRequest详解与示例基本用法示例代码代码详解更复杂的示例:POST请求代码详解结论QML中的XMLHttpRequest详解与示例 XMLHttpRequest 是 QML 中用于执行HTTP请求的一种机制,类似于Web中的AJAX。它可以用来进行异步的数据传输,可以从服务器获取数据,也…