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

这篇博客探讨了如何利用ThreadLocal缓存线程中频繁调用且不需修改的方法结果,以提高效率。通过AOP注解定义切面,拦截器检查ThreadLocal缓存,若无缓存则执行方法并存储结果。
摘要由CSDN通过智能技术生成

适用场景:如果一次请求需要多次调用另外一个方法(该方法获取到的数据不需要修改,如调用第三方的查询接口)可以缓存该方法的结果,以便在后续线程直接使用该结果
实现原理:缓存数据存放在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值