当前位置: 首页 > news >正文

vue单页面做网站加载慢做网站续费要多少钱

vue单页面做网站加载慢,做网站续费要多少钱,网站建设投标文件范本,wordpress怎么做微博1、实现效果 当一个请求线程多次请求A方法时,只会触发一次A方法的实际调用,会将方法结果缓存起来,避免多次调用。 2、实现过程 1. 需要一个注解ThreadLocalCache,在需要缓存的方法上加上该注解 2. 需要一个切面,借助ThreadLocal,将结果缓存起来,利用环绕通知来实现方法拦截从…

1、实现效果

当一个请求线程多次请求A方法时,只会触发一次A方法的实际调用,会将方法结果缓存起来,避免多次调用。

2、实现过程

1. 需要一个注解ThreadLocalCache,在需要缓存的方法上加上该注解
2. 需要一个切面,借助ThreadLocal,将结果缓存起来,利用环绕通知来实现方法拦截从缓存中返回方法执行结果

3、代码实现

3.1、ThreadLocalCache注解创建

作用于方法级别

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ThreadLocalCache {
}

3.2、ThreadLocalTestAspect切面创建

@Aspect
@Component
public class ThreadLocalTestAspect {private ThreadLocal<Map<Object, Object>> threadLocal = new ThreadLocal<>();@Around("@annotation(com.example.test.ThreadLocalCache)")private Object myPointcut(ProceedingJoinPoint proceedingJoinPoint) {//获取方法的入参Object[] args = proceedingJoinPoint.getArgs();Signature signature = proceedingJoinPoint.getSignature();//获取目标方法名String name = signature.getName();//获取目标方法的类的完全限定名String declaringTypeName = signature.getDeclaringTypeName();//生成缓存keyObject key = SimpleKeyGenerator.generateKey(args, declaringTypeName, name);if (Objects.isNull(threadLocal.get())) {threadLocal.set(new HashMap<>(8));}try {if (!threadLocal.get().containsKey(key)) {threadLocal.get().put(key, proceedingJoinPoint.proceed());}} catch (Throwable e) {//日志记录e.printStackTrace();}return threadLocal.get().get(key);}public void removeThreadLocal(){threadLocal.remove();}}

4、测试过程

  1. 创建一个接口及实现
public interface ThreadLocalTestService {Long getParentIdByName(String name);
}
@Service
public class ThreadLocalTestServiceImpl implements ThreadLocalTestService{@ThreadLocalCache@Overridepublic Long getParentIdByName(String name) {//根据name查询父级IDSystem.out.println("com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了");return 666L;}
}
  1. 方法调用
@RestController
@RequestMapping("/ThreadLocalTest")
public class ThreadLocalTest {@Autowiredprivate ThreadLocalTestService threadLocalTestService;@Autowiredprivate ThreadLocalTestAspect threadLocalTestAspect;@GetMapping("getParentIdByName")public Long getParentIdByName(String name){System.out.println(Thread.currentThread().getName());threadLocalTestService.getParentIdByName(name);threadLocalTestService.getParentIdByName(name);Long parentId = threadLocalTestService.getParentIdByName(name);threadLocalTestAspect.removeThreadLocal();return parentId;}}

3.执行结果

http-nio-8087-exec-1
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-2
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-4
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-5
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-6
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-7
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-8
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-10
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-9
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-3
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-1
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-2
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了

http-nio-8087-exec-是线程名字,可以看到http-nio-8087-exec-1执行了两次,每次都调用四次getParentIdByName 方法,但getParentIdByName 方法实际至执行了一次,剩下的三次是从缓存中获取的。
这里需要注意的是:线程每次结束的时候都需要调用threadLocalTestAspect.removeThreadLocal();为的是把当前线程threadLocal里的缓存抹掉,因为同一个线程可能会被重复使用,所以不抹掉,可能会导致多次请求使用同一个线程,目标方法只会执行一次,和我们的最初的实现效果是违背的。
下面是不调用threadLocalTestAspect.removeThreadLocal();的执行结果

http-nio-8087-exec-1
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-3
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-8
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-5
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-6
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-7
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-4
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-9
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-10
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-2
com.example.test.ThreadLocalTestServiceImpl.getParentIdByName 执行了
http-nio-8087-exec-1
http-nio-8087-exec-3
http-nio-8087-exec-8
http-nio-8087-exec-5

可以很清楚的看到http-nio-8087-exec-1、3、5、8再次请求的时候getParentIdByName 方法并没有执行了,因为之前的threadlocal缓存没有被remove导致的。

http://www.yayakq.cn/news/135280/

相关文章:

  • 中国的网站域名中国建筑装饰网上海
  • 灌阳县建设局门户网站中国建设银行wap网站
  • 深圳正规做网站的公司企业网页设计教程
  • 做家乡网站源代码wordpress选图框
  • 容桂佛山做app网站宝塔建设的网站火车头发布失败
  • 凡客建站免费的可以用多久哈尔滨百姓网
  • 绍兴网站建设专业的公司4000-262-做胎儿羊水鉴定网站
  • 网站制作费用属于广告费吗网站如何在百度上做推广方案
  • 鞋材加工东莞网站建设北湖区网站建设公司
  • 中国网站排名徐东网站建设公司
  • 如何运用网站模板c2c电商平台网站
  • 义乌企业网站设计微信官方网页版
  • 一般做一个网站专题页多少钱手机必备app
  • 泉州专业网站营销网站服务公司排名
  • 北京企业建站服务中企计算机网站建设与管理是什么意思
  • 网站开发 程序开发阶段支付宝 网站接口
  • 公需科目在哪个网站做客源引流推广
  • 网站集约化建设 要求莱芜十七中网站
  • 国内十大网站制作公司wordpress评论特效
  • dedecms 网站迁移西安企业seo外包服务公司
  • 做娱乐网站被坑建设网站ppt
  • 南京宜电的网站谁做的虫点子创意设计公司
  • 上海网站建设公司哪家好?营销网站的优势是什么意思
  • 做网站和编程序互联业务登录页 网站
  • 第三方网站备案ucenter wordpress
  • jsp网站开发 开题依据三类医疗器械
  • 郑州软件开发公司网站购物网站 备案
  • 建设网站要准备什么贵州省建设厅建筑官方网站
  • 做做做做网站网站黄页推广软件
  • 专注聊城做网站的公司论坛html模板