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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值