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

loadingcache优化

问题分析

通过当前现场的火焰图进行分析
在这里插入图片描述
原本的loadingcache

  public LoadingCache<Integer, Student> map = Caffeine.newBuilder().refreshAfterWrite(CONTRACT_CACHE_HOURS, TimeUnit.HOURS).maximumSize(CONTRACT_CONFIG_CACHE_SIZE).recordStats().build(key -> {try {Student condition = new Student();condition.setKey(key);List<Student> Students = studentMapper.selectBySelective(condition);return Students.stream().findFirst().orElse(null);} catch (Exception e) {//}return null;});

调用点

  @Overridepublic Student getStudentByKey(Integer key) {if (null == key) {return null;}return map.get(key);}

原理分析,get在并发时会出现锁竞争
在这里插入图片描述

代码优化

查阅官方文档推荐使用buildAsync,替换掉get和build,修改后的代码如下

  private static final ExecutorService CACHE_REFRESH_EXECUTOR = Executors.newFixedThreadPool(8);public AsyncLoadingCache<Integer, Student> map =Caffeine.newBuilder().refreshAfterWrite(CONTRACT_CACHE_HOURS, TimeUnit.HOURS).maximumSize(CONTRACT_CONFIG_CACHE_SIZE).recordStats().buildAsync((key, executor) -> CompletableFuture.supplyAsync(() -> {try {Student condition = new Student();condition.setKey(key);List<Student> students = studentMapper.selectBySelective(condition);return students.stream().findFirst().orElse(null);} catch (Exception e) {// }return null;}, CACHE_REFRESH_EXECUTOR));

AsyncLoadingCache的get是一个CompletableFuture,是异步加载
在这里插入图片描述

对比build和buildAsync的不同

通过源码可以看到buildAsync的cacheloader是一个AsyncCacheLoader
在这里插入图片描述
在这里插入图片描述
所以build在构造loadingcache的时候传入的是同步cacheloader,所以get就会出现锁等待;但是buildAsync在构造loadingcache的时候传入的是异步AsyncCacheLoader,所以get也是异步。

http://www.lryc.cn/news/547995.html

相关文章:

  • 【Vue3 Element UI - Plus + Tyscript 实现Tags标签输入及回显】
  • STM32 子设备通过CAN发送数据到主设备
  • Python可视化——地理空间型图表(自用)
  • WordPress报502错误问题解决-php-fpm-84.service loaded failed failed LSB: starts php-fpm
  • Python在SEO中的自动化应用爬虫开发与日志分析实例
  • thingsboard edge 在windows 环境下的配置
  • nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测
  • nginx 配置403页面(已亲测)
  • SyntaxError: Invalid or unexpected token in JSON at position x
  • Uncaught TypeError: Cannot read properties of undefined (reading ‘xxx‘)
  • Nginx 跨域配置详细讲解
  • 前端开发基石:HTML语义化深度解析与实践指南
  • mongodb安装教程以及mongodb的使用
  • C# 中的多线程同步机制:lock、Monitor 和 Mutex 用法详解
  • 【通义万相】蓝耘智算 | 开源视频生成新纪元:通义万相2.1模型部署与测评
  • 期权帮|中证1000股指期权交割结算价怎么算?
  • Python 面向对象高级编程-定制类
  • qt creator示例空白
  • MyBatis-Plus 与 Spring Boot 的最佳实践
  • TDengine 中的标签索引
  • 工业自动化核心:BM100 信号隔离器的强大力量
  • Ascend开发板镜像烧录、联网、其他设备访问
  • Llama-Factory框架下的Meta-Llama-3-8B-Instruct模型微调
  • MySQL进阶-分析查询语句EXPLAIN
  • Python 高级编程与实战:构建数据可视化应用
  • 学习threejs,Animation、Core、CustomBlendingEquation、Renderer常量汇总
  • Java直通车系列14【Spring MVC】(深入学习 Controller 编写)
  • 【蓝桥杯集训·每日一题2025】 AcWing 5539. 牛奶交换 python
  • Mybatis缓存机制(一级缓存和二级缓存)
  • 设计模式--单例模式