当前位置: 首页 > 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;
          }
      );

调用点

  @Override
  public 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也是异步。

相关文章:

  • STM32中断向量表的个人理解
  • 第 k 个缺失的正整数
  • DevSecOps CI/CD 管道中数字供应链安全的集成策略
  • 应用案例 | 精准控制,高效运行—宏集智能控制系统助力SCARA机器人极致性能
  • App Standby省电机制流程
  • 常见排序算法鉴赏(原理剖析+动图演示)
  • Vue-flow中动态流程图的实现
  • ffmpeg windows 基本命令
  • 安装并运行hadoop程序
  • macos 程序 运行
  • clang-format安装配置与vscode支持
  • 【附源码】Java动漫视频网站源码【带弹幕系统】+SpringBoot+VUE+前后端分离
  • 有关Java中的IO(2) --字符流以及其他流
  • upload-labs详解(13-20)文件上传分析
  • manus是什么?能干啥?
  • 基于SpringBoot的车辆违章信息管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • LLM 学习(二 完结 Multi-Head Attention、Encoder、Decoder)
  • LN1132 低功耗 300mA 低压差 CMOS 电压稳压器
  • debain12.9使用unsloth微调Qwen2.5模型
  • Ubuntu20.04搭建gerrit code review
  • 做网站 用 云主机/教育培训网站模板
  • 做哪类视频网站需要视频证书/磁力链接搜索引擎2021
  • vs2017移动网站开发/苏州网站
  • 祖传做网站/做网站流程
  • asp网站开发书籍/湛江百度seo公司
  • 郑州哪家公司做网站/app开发多少钱