Redeis缓存查询基于元注解与AOP结合使用——不过时的优雅
创始人
2024-03-02 17:15:30
0

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();}
}

相关内容

热门资讯

美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...