在平时的开发中,我们会经常用到字典,比如我们数据库里面存的是设备编码,展示需要的是设备名称;数据库中存的是用户id,展示的是用户名称。这样的字段我们会频繁的调用,那么就会频繁的查询数据库,为了保证访问速度,我们会使用缓存。但是如果使用Redis之类的中间件缓存,又有点大材小用。当然我们也可以自己将需要的数据存入Map中,但是要考虑Map的预计容量,数据缓存的时间等等。这样对Map的设计就比较麻烦。
这里我推荐Google的类库框架Guava里面的本地缓存。
使用前我们先引用Guava的Maven依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
我们先来写一个省会的实体类Province
:
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Province {
//省会名称
private String name;
//省会编码 如:PR001
private String code;
}
这里定义两个字段,省会名称和省会编码。一般入库存的是编码code
,展示的时候我们需要去专门的表里面查询获取name
。
我们再来定义一个缓存失效的监听器CustomizeRemovalListener
:
public class CustomizeRemovalListener implements RemovalListener<String, Province> {
@Override
public void onRemoval(RemovalNotification<String, Province> removalNotification) {
String reason = String.format("key=%s,value=%s,reason=%s", removalNotification.getKey(), removalNotification.getValue(), removalNotification.getCause());
System.out.println(reason);
}
}
当我们手动失效缓存,或者过期时间到了,就会被监听到。控制台就会打印出reason
。onRemoval()
方法可以根据业务需求进行编写。
我们来使用缓存:
如上代码,我们调用loadingCache.get()
方法时,会先在缓存中查找,如果缓存中没有,会执行这段代码:
// 如果找不到元素,会调用这里
@Override
public Province load(String s) {
//实际情况这里就是查库
System.out.println("查了数据库哦");
return getDataFromDb();
}
我们就在这段代码中查库。在图示代码中,我们先创建一个初始缓存:
LoadingCache<String, Province> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1000) // 容量
.expireAfterWrite(3, TimeUnit.SECONDS) // 过期时间
.removalListener(new CustomizeRemovalListener()) // 失效监听器
.build(cacheLoader);
这里创建了缓存的初始容量、过期时间、以及缓存失效后的监听功能。
我们将数据存入缓存中:
loadingCache.put("PR001", getDataFromDb());
前面3次获取都是从缓存loadingCache
获取值,当线程睡眠4秒,超过过期时间,缓存会失效,触发监听器。第4次获取就会从load(String s)
中获取。
控制台打印结果如下:
第一次获取:Province(name=北京, code=PR001)
第二次获取:Province(name=北京, code=PR001)
第三次获取:Province(name=北京, code=PR001)
key=PR001,value=Province(name=北京, code=PR001),reason=EXPIRED
查了数据库哦
第四次获取:Province(name=北京, code=PR001)
这段代码
key=PR001,value=Province(name=北京, code=PR001),reason=EXPIRED
显示缓存因超时而过期。
当然Guava还有很多功能哦,感兴趣的童鞋可以看看我写的这篇文章:
“[程序员的福音——Guava](程序员的福音——Guava (qq.com))
”
当然世面上还有很多本地缓存框架,比如Caffeine(Guava缓存的升级版)、Ehcache等。有兴趣的童鞋可以去了解下。
往期推荐
扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料
回复"java" 获取java电子书;
回复"python"获取python电子书;
回复"算法"获取算法电子书;
回复"大数据"获取大数据电子书;
回复"spring"获取SpringBoot的学习视频。
回复"面试"获取一线大厂面试资料
回复"进阶之路"获取Java进阶之路的思维导图
回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)
回复"总结"获取Java后端面试经验总结PDF版
回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)
回复"并发导图"获取Java并发编程思维导图(xmind终极版)
另:点击【我的福利】有更多惊喜哦。