Redeis缓存查询基于元注解与AOP结合使用——不过时的优雅

news/2024/5/6 17:38:36/文章来源:https://blog.csdn.net/acwing/article/details/128016641

Redeis缓存查询基于元注解与AOP结合使用

根据优化需要,数据查询的时候无法避免的使用Redis基于缓存查询,进而减少对于数据库的查询压力,对于过多的方法基于缓存存储,为提高代码的复用性,采用一种不过时的写法。

整体的逻辑是 根据key对应查询Redis 获取缓存信息,如果key值不存在,则对应字节在原方法中调用 直接进入数据库进行查询,通过jedis进行存入到Redis中。

元注解

描述注解的注解 就是元注解
此处可以理解为 自定义注解 进行对原注解的扩展

元注解:

  1. @Target 定义Annotation 所修饰的对象范围 作用域类或者接口上
  2. @Retention 定义Annotation 保留时间
  3. @Documented 被修饰的注解可以被文档化
  4. @Inherited 定义该注解效果是否能被注解修饰的子类所拥有

自定义注解:

@Target(ElementType.METHOD) // 表示作用于方法
@Retention(RetenionPolicy.RUNTIME)// 表示运行时即效
public @interface CacheFind{public String key() defalut "";public String seconds() defalut 0;
}

此时对应于 注解CacheFind 就可以应用于对应的方法上,只不过目前还未做对应的方法实现功能。对应结合AOP 声明对应的切面,进行功能逻辑的扩展。

AOP

  • 切面aspect 横切对象 一般为一个具体的类对象
  • 通知advice 切面的某个特定的连接点上执行的动作
  • 连接点 joinpoint 程序执行过程中某个特定的点 一般指拦截到的方法
  • 切入点poincut 对多个连接点(joinpoint) 一种定义 一般可以理解为多个连接点的集合

在这里插入图片描述

@Around

Bean 用于指定bean对象的所有方法

Within 用于匹配指定包下所有的类

Execution用于按照指定语法规则匹配到具体的方法

Annotation 用于指定注解修饰的方法

对应的切面
使用自定义注解,实现Redis的查询扩充


@Aspect
@Component
public calss RedisAop{Private static final ObjectMapper mapper = new ObjectMapper();@Autowiredprivate Jedis jedis;@Around("@annotation(cachefind)") public Object around(ProceedingJoinPoint joinPoint,CacheFind cachefind){String key =getKey(joinPoint,cacheFind);String json=jedis.get(key);Object returnObject=null;if(StringUtils.isEmpty(json)){//  如果此处数据 不存在于Redis缓存中  则直接执行原方法 直接进行数据库的查询	try{returnObject=joinPoint.proceed();String objJSON=mapper.writeValueAsString(returnObject);//  对应reids中的超时时间 判断是否指定还是默认if(cacheFind.seconds>0){jedis.setex(key,chacheFind.seconds,objJSON);}else{jedis.set(key,objJSON);}}catch(Throwable e){e.printStackTrace();throw new RuntimeException();}}else{// 获取返回对象的字节码Class<?> targetClass=getClass(joinPoint);// 此处的转换需要 进行将json转换为java 然后返回returnObject=mapper.readValue(json,targetClass);}return returnObject}private String getKey(ProceedingJoinPoint joinPoint,CacheFind cachefind){if(!StringUtils.isEmpty(cacheFind.key())){return cacheFind.key();}String className = joinPoint.getSignature().getDeclaringTypeName();String methodName= joinPoint.getStignature().getName();String firstArg= joinPoint.getArgs()[0].toString();return className+methodName+"::"+firstArgs;}private Class<?> getClass(ProceedingJoinPoint joinPoint){MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();return methodSignature.getReturenType();}
}

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

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

相关文章

一文详解,数据仓库、数据库、数据中台、数据湖的区别

数据时代&#xff0c;各行业的企业都已经开始通过数据库来沉淀数据&#xff0c;但是真的论起数据库、数据仓库、数据中台&#xff0c;还是新出现的数据湖&#xff0c;它们的概念和区别&#xff0c;可能知道的人就比较少了&#xff0c;今天我们详细来比较了解一下。 数据仓库是…

你的数据库到底应该如何存储密码?

最近接手公司一个之前的服务&#xff0c;竟然发现用户密码是明文存储在数据库中&#xff01; 说实话还是有点吃惊的&#xff0c;这可不兴学 CSDN 呀&#xff08;手动狗头&#xff09;&#xff0c;至少也得搞个 MD5 存一存吧。 不过 MD5 其实也没啥用&#xff0c;今天我们就来…

JVM之运行时数据区 PC、虚拟机栈、本地方法栈

JVM之运行时数据区 PC、虚拟机栈、本地方法栈PC寄存器线程回顾寄存器实践面试使用PC寄存器存储字节码指令地址有什么用&#xff1f;为什么使用PC寄存器记录当前线程的执行地址PC寄存器为什么会被设定为线程私有虚拟机栈虚拟机栈出现背景简介栈可能出现的异常栈中存储着什么运行…

电商新趋势:Starday拿下黑色星期五的制胜法宝是物流速度

国内电商“双十一”购物狂欢季活动已经闭幕&#xff0c;“双十二”又将袭来&#xff0c;但更多人却将眼光放在蓬勃发展的跨境电商行业中。当下跨境电商卖家们正在各大跨境电商服务平台的带领下全力备战&#xff0c;在“黑色星期五”期间推出各类大促活动&#xff0c;奋力冲刺20…

Unknown custom element: <el-image>无法使用该组件,升级element-ui版本后项目报错

需求背景&#xff1a; 项目中需要使用图片点击放大&#xff0c;想要使用<el-image>组件&#xff0c;引入后报了下面的错&#xff0c;需要升级element版本&#xff0c;element-ui版本过低&#xff0c;没有该组件。 过程&#xff1a; cnpm i element-ui2.14.1 --save-dev…

clickhouse远程访问Oracle 11g数据库(clickhouse-jdbc-bridge)

1、简介 clickhouse-jdbc-bridge&#xff1a;是clickhouse提供的一个jdbc组件&#xff0c;用于通过JDBC的方式远程访问其他数据库表。 2、安装 &#xff08;1&#xff09;下载源文件并打包获取clickhouse-jdbc-bridge-2.0.7-shaded.jar 在官网&#xff1a;https://github.c…

tictoc例子理解10-13

tictoc10-13tictoc 10 几个模块连接&#xff0c;发送消息直到模块3收到消息tictoc 11 新增信道定义tictoc 12 双向连接信息简化定义tictoc 10 几个模块连接&#xff0c;发送消息直到模块3收到消息 让我们用几个(n)’ tic’模块让它更有趣&#xff0c;并将每个模块连接到其他模…

ANR 触发、监控、分析 一网打尽

平时看博客或者学知识&#xff0c;学到的东西比较零散&#xff0c;没有独立的知识模块概念&#xff0c;而且学了之后很容易忘。于是我建立了一个自己的笔记仓库 (一个我长期维护的笔记仓库&#xff0c;感兴趣的可以点个star~你的star是我写作的巨大大大大的动力)&#xff0c;将…

大客车玻璃擦净器设计

目 录 摘 要 I ABSTRACT II 1 绪论 1 1.1选题背景及意义 1 1.2发展现状 2 1.3发展趋势 3 1.4研究主要内容 4 2 大客车玻璃擦净器总体方案设计 5 2.1 大客车玻璃擦净器设计思想 5 2.2功能分析 5 2.3工作原理分析 6 2.4功能分解 6 2.4.2传动系统 6 2.4.3真空吸盘 7 2.4.4 清洁刷 …

欢聚季报图解:营收5.87亿美元同比降10% 净利提升

雷递网 雷建平 11月29日欢聚集团(NASDAQ: YY)今日发布2022年第三季度财报。财报显示&#xff0c;欢聚集团2022年第三季度营收为5.867亿美元&#xff0c;较上年同期下降10%。欢聚集团2022年第三季度Bigo Live的平均移动MAU为3540万&#xff0c;较上年同期的3100万增长14.2%&…

转铁蛋白修饰的去氢骆驼蓬碱磁纳米脂质体TF-HM-MPS

转铁蛋白又名运铁蛋白&#xff08;Transferrin&#xff0c;TRF、Tf&#xff09;&#xff0c;负责运载由消化管吸收的铁和由红细胞降解释放的铁。以三价铁复合物&#xff08;Tf-Fe3&#xff09;的形式进入骨髓中&#xff0c;供成熟红细胞的生成。转铁蛋白主要存在于血浆中&#…

冒烟测试的7个好处,你是否经常用到它?

以下为作者观点&#xff1a; 冒烟测试(smoke testing)是在开发的早期阶段评估基本的软件组件&#xff0c;以检查它们是否 “着火”&#xff08;有问题&#xff09;&#xff0c;本文旨在介绍冒烟测试及其在程序开发过程中的作用。 什么是冒烟测试&#xff1f; 冒烟测试是在开…

企业日常公关如何抵御负面信息的入侵?

如今&#xff0c;互联网时代信息传播速度极快&#xff0c;这使得宣传工作效率倍增&#xff0c;也给企业舆情管理带来一定的挑战。舆情优化搞得好&#xff0c;企业宣传工作事半功倍&#xff0c;网络舆论走向负面的话&#xff0c;则对宣传工作非常不利&#xff0c;会导致推广效果…

狂神说Go语言学习笔记(一)

一、Go语言的发展史 二、Go语言能做什么 三、Go语言环境安装 下载地址 国外网站太慢&#xff0c;我们使用中文网进行下载&#xff01; Go下载 - Go语言中文网 - Golang中文社区 (studygolang.com) 安装 无脑下一步就完了 &#xff0c;注意下这里创建自己设置一个Go语言的环…

比搞笑诺奖还离谱,看完国产AIGC最新创作,把我给整不会了

杨净 萧箫 发自 凹非寺量子位 | 公众号 QbitAI现在&#xff0c;AI生成的东西&#xff0c;“真实”得都让我有点害怕了——只是给出《马斯克获得诺贝尔物理学奖》这个标题&#xff0c;AI竟然就刷刷刷几下&#xff0c;蹦出了一整套大纲来&#xff1f;&#xff01;如果让AI生成一些…

计算机网络——分层结构,协议接口,服务

分层结构 主机进行资源共享时需满足以下条件&#xff1a; &#xff08;1&#xff09;发起通信的计算机要将数据通路进行激活 &#xff08;2&#xff09;告诉网络如何识别主机 &#xff08;3&#xff09;发起通信的主机要查明目的主机是否开机等 &#xff08;4&#xff09;发起…

【Linux】权限讲解

一、什么是权限 1、权限概念 权限随处可见&#xff0c;在生活中&#xff0c;腾讯非VIP用户不能观看VIP视频&#xff0c;看小说也需要会员&#xff0c;所以权限是限制人的&#xff0c;一件事是否允许被谁做。在Linux系统中也有许多权限&#xff0c;访问文件需要权限&#xff0c…

Windows OpenGL 图像色彩替换

目录 一.OpenGL 图像色彩替换 1.原始图片2.效果演示 二.OpenGL 图像色彩替换源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL…

[附源码]Python计算机毕业设计Django的实验填报管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

FastDFS文件上传

分布式文件存储-FastDFS 介绍 FastDFS为互联网量身定制&#xff0c;充分考虑了冗余备份、负载均衡、线性扩容等机制&#xff0c;并注重高可用、高性能等指标&#xff0c;使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 FastDFS体系结构 FastD…