Cache统一缓存处理(优化)利用aop切面技术

新建Cache注解

import java.lang.annotation.*;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Cache {
    //缓存存储时间
    long expire() default 1 * 60 * 1000;
    //缓存标识 key
    String name() default "";

}

 

CacheAspect配置类 aop切面

//aop 定义一个切面,切面定义了切点和通知的关系
@Aspect
@Component
@Slf4j
public class CacheAspect {

    private static final ObjectMapper objectMapper = new ObjectMapper();


    @Autowired
    private RedisTemplate<String, String> redisTemplate;

  //切面 @Pointcut(
"@annotation(com.he.blogapi.common.cache.Cache)") public void pt(){} @Around("pt()") public Object around(ProceedingJoinPoint pjp){ try { Signature signature = pjp.getSignature(); //类名 String className = pjp.getTarget().getClass().getSimpleName(); //调用的方法名 String methodName = signature.getName(); Class[] parameterTypes = new Class[pjp.getArgs().length]; Object[] args = pjp.getArgs(); //参数 String params = ""; for(int i=0; i<args.length; i++) { if(args[i] != null) { params += JSON.toJSONString(args[i]); parameterTypes[i] = args[i].getClass(); }else { parameterTypes[i] = null; } } if (StringUtils.isNotEmpty(params)) { //加密 以防出现key过长以及字符转义获取不到的情况 params = DigestUtils.md5Hex(params); } Method method = pjp.getSignature().getDeclaringType().getMethod(methodName, parameterTypes); //获取Cache注解 Cache annotation = method.getAnnotation(Cache.class); //缓存过期时间 long expire = annotation.expire(); //缓存名称 String name = annotation.name(); //先从redis获取 String redisKey = name + "::" + className+"::"+methodName+"::"+params; String redisValue = redisTemplate.opsForValue().get(redisKey); if (StringUtils.isNotEmpty(redisValue)){ log.info("走了缓存~~~,{}",redisKey); Result result = JSON.parseObject(redisValue, Result.class); return result; } Object proceed = pjp.proceed(); redisTemplate.opsForValue().set(redisKey,JSON.toJSONString(proceed), Duration.ofMillis(expire)); log.info("存入缓存~~~ {},{}",className,methodName); return proceed; } catch (Throwable throwable) { throwable.printStackTrace(); } return Result.fail(-999,"系统错误"); } }

 

Controller使用@Cache注解

    @Cache(name="hotArticle",expire=5*60*1000)

 

posted @ 2022-09-15 15:32  Homnay  阅读(52)  评论(0)    收藏  举报