1.需求场景
如果你要做跨系统全局缓存,高可用又性能高,存储量还大当然有memcache,redis首选,其次要求没那么高还有oscache,ehcache也可以单机使用。
但是如果只想单机简单快速的使用一下guava LoadingCache就是非常好的选择了
2.guava LoadingCache
线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素。
提供了三种基本的缓存回收方式:基于容量回收、定时回收和基于引用回收。定时回收有两种:按照写入时间,最早写入的最先回收;按照访问时间,最早访问的最早回收。
监控缓存加载/命中情况。
集成了多部操作,调用get方式,可以在未命中缓存的时候,从其他地方获取数据源(DB,redis),并加载到缓存中。
可以设置缓存超时,缺点Guava Cache的超时机制不是精确的。
3.案例代码
pom
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.1-jre</version>
</dependency>
初始化缓存对象
private static LoadingCache<String, Optional<TaskConfigure>> taskCache = CacheBuilder.newBuilder()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.DAYS)
.build(new CacheLoader<String, Optional<TaskConfigure>>() {
@Override
public Optional<TaskConfigure> load(String key) {
return Optional.empty();
}
});
放入缓存
taskCache.put(taskId, Optional.of(configure));
取出缓存
taskCache.get(taskId).orElse(null);