最近项目中的本地缓存,看是从Guava改成了Caffeine,据说是性能更好,既然性能更好的话,那么就用起来吧。不过在使用过程中,发现了单个load和批量loadall方面的一些小设置,记录一下。

一般说来,我们获取单条记录的时候,一般都是 cache.get(id),当数据过期,会从提前设定好的load方法中获取数据。

同样的,如果我们想批量获取记录的时候,一般都是用cache.getAll(ids),当数据过去,会从提前设定好的loadAll方法中获取数据。

实际在测试的时候,发现,利用如下的缓存初始化方式,无论怎么泡cache.getAll(ids)方法,发现总会从load方法中加载数据,硬生生的把批量获取变成了单个循环获取,这就导致几十个redis命令一起发到redis集群那边,造成了网络浪费和性能差异:

 batchNumCache = Caffeine.newBuilder()
.initialCapacity(cacheSize)
.maximumSize(cacheSize)
.refreshAfterWrite(cacheTime, TimeUnit.SECONDS)
.build(new CacheLoader<Long, Map<String, Integer>>() { @Override
public Map<String, Integer> load(Long batchId) throws Exception {
return getBatchNumJimdb(batchId);
} @Override
public Map<Long, Map<String, Integer>> loadAll(Iterable<? extends Long> batchIds) throws Exception {
if (Iterables.isEmpty(batchIds)) {
return null;
}
return getAllBatchNumJimdb(Lists.newArrayList(batchIds));
}
});

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

如上代码可以看出,load方法会调用getBatchNumJimdb加载数据,而loadAll方法会调用getAllBatchNumJimdb加载数据,getAllBatchNumJimdb加载数据的方式就是利用redis的pipeline,一次性将请求发给redis,然后获取返回结果。

虽然如上代码不能按照我们既定的方式工作,那么肯定配置有些什么问题,后来经过诸多的ut测试,发现设置上expireAfterWrite属性,整体就完美了。最终代码如下:

batchNumCache = Caffeine.newBuilder()
.initialCapacity(cacheSize)
.maximumSize(cacheSize)
.refreshAfterWrite(cacheTime, TimeUnit.SECONDS)
.expireAfterWrite(cacheTime, TimeUnit.SECONDS)
.build(new CacheLoader<Long, Map<String, Integer>>() { @Override
public Map<String, Integer> load(Long batchId) throws Exception {
return getBatchNumJimdb(batchId);
} @Override
public Map<Long, Map<String, Integer>> loadAll(Iterable<? extends Long> batchIds) throws Exception {
if (Iterables.isEmpty(batchIds)) {
return null;
}
return getAllBatchNumJimdb(Lists.newArrayList(batchIds));
}
});

如上代码,整体就ok了。当使用cache.get的时候,会从load加载,当使用cache.getall的时候,会从loadall加载。

Caffeine批量加载浅析的更多相关文章

  1. vue2组件懒加载浅析

    vue2组件懒加载浅析 一. 什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 二.为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大, ...

  2. Android之批量加载图片OOM问题解决方案

    一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本 ...

  3. 在mybatis 中批量加载mapper.xml

    可以直接加载一个包文件名,将这个包里的所有*mapper.xml文件加载进来. 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载: 必须按一定的标准:即xml文件和 ...

  4. Android学习笔记_37_ListView批量加载数据和页脚设置

    1.在activity_main.xml布局文件中加入ListView控件: <RelativeLayout xmlns:android="http://schemas.android ...

  5. 解决 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 以及MyBatis批量加载xml映射文件的方式

    错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 的出现,意味着项目需要xml文件来 ...

  6. python之使用 wkhtmltopdf 和 pdfkit 批量加载html生成pdf,适用于博客备份和官网文档打包

    0. 1.参考 Python 爬虫:把廖雪峰教程转换成 PDF 电子书 https://github.com/lzjun567/crawler_html2pdf wkhtmltopdf 就是一个非常好 ...

  7. C++批量加载动态库函数方法

    1.枚举定义enum  {    // 0 - GigE DLL (implicitly called)    Func_isVersionCompliantDLL,    Func_isDriver ...

  8. android 批量加载数据

    public class MainActivity extends Activity { private ListView listView; private List<String> d ...

  9. 【HBase】通过Bulkload批量加载数据到Hbase表中

    目录 需求 步骤 一.开发MapReduce 二.打成Jar包放到linux执行 三.有两种办法将HFile文件加载到HBase表中 开发代码 Hadoop命令运行 需求 将hdfs上面的这个路径 / ...

随机推荐

  1. PowerMock学习(九)之Mock Answer的使用

    关于Mock Answer 上一篇文章,有介绍过关于Arguments Matche的使用,其实 Answer的作用与其比较类似,但是它比 Arguments Matcher 更加强大. Argume ...

  2. 【数据结构】之顺序表(C语言描述)

    顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...

  3. 针对可变类型的for遍历

    针对可变类型的for遍历 举个例子 lis = [1,6,1, 2, 3,3, 4, 5] for i in lis: lis.remove(i) print(lis) [6, 1, 2, 3, 3, ...

  4. 【并发编程】Object的wait、notify和notifyAll方法

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 方法简介 wait方法 wait方法是Object类中的 ...

  5. 基于JDK1.8的JVM 内存结构【JVM篇三】

    目录 1.内存结构还是运行时数据区? 2.运行时数据区 3.线程共享:Java堆.方法区 4.线程私有:程序计数器.Java 虚拟机栈.本地方法栈 5.JVM 内存结构总结 在我的上一篇文章别翻了,这 ...

  6. 转:Spring配置文件<context:property-placeholder>标签使用漫谈

    <context:property-placeholder>标签提供了一种优雅的外在化参数配置的方式,不过该标签在Spring配置文件中只能存在一份!!! 众所周知,Spring容器是采用 ...

  7. 洛谷 题解 2165 [AHOI2009]飞行棋

    本蒟蒻又来发题解了, 看到这个题目,本蒟蒻直接开始推公式.. 嗯,可以通过弧长,推出弦长(l = 2 * r * cos(90 * l / (r * Π)); 然后对比各条弦长的平方和与直径的平方. ...

  8. jquery.countdown 倒计时插件的学习

    1.第一种简单的使用 第一个时间是你的倒计时截止时间,finalDate格式可以是YYYY/MM/DD MM/DD/YYYY YYYY/MM/DD hh:mm:ss MM/DD/YYYY hh:mm: ...

  9. [TimLinux] Python 函数

    1. 函数(function)与方法(method)的区别 方法:在类结构体中通过def语句声明的代码块称为方法,比如类方法(classmethod),实例方法,静态方法(staticmethod)等 ...

  10. 上手spring boot项目(三)之spring boot整合mybatis进行增删改查

    使用mybatis框架进行增删改查大致有两种基础方式,一种扩展方式.两种基础方式分别是使用xml映射文件和使用方法注解.扩展方式是使用mybatis-plus的方式,其用法类似于spring-data ...