ThreadLoacal缓存 - 缓存一个线程频繁调用的方法结果

适用场景:如果一次请求需要多次调用另外一个方法(该方法获取到的数据不需要修改,如调用第三方的查询接口)可以缓存该方法的结果,以便在后续线程直接使用该结果
实现原理:缓存数据存放在ThreadLocal变量中,使用aop拦截需要缓存的方法,如果缓存中有该方法的缓存结果则直接返回,如果没有则执行该方法后缓存该方法的结果。
代码如下:

1. aop注解 定义切面

 
  1. import java.lang.annotation.*;
  2. /**
  3. * 是否启用自定义的 线程缓存
  4. */
  5. @Documented
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Target({ElementType.METHOD, ElementType.TYPE})
  8. public @interface CacheAopFitter {
  9. String value() default "";
  10. int timeout() default 10; //缓存时间(单位:秒) 默认10秒
  11. }

2. aop 拦截类 拦截注解的方法

 
  1. import lombok.extern.slf4j.Slf4j;
  2. import org.aspectj.lang.ProceedingJoinPoint;
  3. import org.aspectj.lang.annotation.Around;
  4. import org.aspectj.lang.annotation.Aspect;
  5. import org.aspectj.lang.annotation.Pointcut;
  6. import org.springframework.stereotype.Component;
  7. @Aspect
  8. @Component
  9. @Slf4j
  10. public class CacheAop {
  11. //控制器切点
  12. @Pointcut("@annotation(com.mcs.cache.democache.aop.CacheAopFitter) || @within(com.mcs.cache.democache.aop.CacheAopFitter)")
  13. public void cachePoint() {
  14. }
  15. @Around("cachePoint()")
  16. public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
  17. //生成key
  18. String key = CacheUtils.createKey(joinPoint);
  19. //判断是否存在 如果有这直接返回
  20. if (CacheUtils.containsKey(key)) {
  21. return CacheUtils.getByKey(key);
  22. }
  23. Object result = joinPoint.p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值