ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Guava Cache 介绍
[打印本页]
作者:
悠扬随风
时间:
2023-12-15 19:51
标题:
Guava Cache 介绍
Guava 是 Google 提供的一套 Java 工具包,而 Guava Cache 是该工具包中提供的一套完善的 JVM 级别高并发缓存框架;本文主要介绍它的相关功能及基本使用,文中所使用到的软件版本:Java 1.8.0_341、Guava 32.1.3-jre。
1、简介
缓存在很多情况下非常有用。例如,当某个值的计算或检索代价很高,并且你需要在特定输入下多次使用该值时,就应该考虑使用缓存。
Guava Cache 与 ConcurrentMap 类似,但并不完全相同。最基本的区别在于,ConcurrentMap 会一直保存所有添加到其中的元素,直到显式地将它们删除。而 Guava Cache 通常会配置自动删除条目,以限制其内存占用。在某些情况下,即使不删除条目,LoadingCache 也很有用,因为它具有自动加载条目的功能。
通常情况下,Guava Cache 适用于以下情况:
你愿意花费一些内存来提高速度。
你预期某些键有时会被多次查询。
你的缓存不需要存储超过内存容量的数据。(Guava Cache 是局限于应用程序运行期间的本地缓存。它们不会将数据存储在文件或外部服务器上。如果这不符合你的需求,可以考虑使用像Memcached 这样的工具。)
如果你的情况符合上述每一点,那么 Guava Cache 可能适合你。
注意:如果你不需要缓存的特性,ConcurrentHashMap 在内存效率方面更高——但是使用任何 ConcurrentMap 几乎不可能复制大多数 Guava Cache 的特性。
2、数据加载
使用 Guava Cache 时,首先要问自己一个问题:是否有合理的默认函数来加载或计算需缓存的数据?如果是这样,应该使用 CacheLoader。如果没有,或者需要覆盖默认函数,但仍然希望具有原子的“如果不存在则计算并获取”语义,你应该将一个 Callable 对象传递给 get 方法。可以直接使用 Cache.put 方法插入元素,但更推荐自动加载数据,因为这样可以更容易地推断所有缓存内容的一致性。
2.1、CacheLoader
LoadingCache 是一个带有
CacheLoader
的缓存。创建 CacheLoader 很容易,只需要实现方法 V load(K key) throws Exception 即可。
LoadingCache<Long, String> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(new CacheLoader<Long, String>() {
@Override
public String load(Long key) throws Exception {
//TODO: 根据业务加载数据
return RandomStringUtils.randomAlphanumeric(10);
}
});
try {
log.info(loadingCache.get(1L));
} catch (ExecutionException e) {
e.printStackTrace();
}
复制代码
LoadingCache 使用
get(K)
方法来获取数据。该方法要么返回已缓存的值,要么使用 CacheLoader 来原子地加载一个新值到缓存中。由于 CacheLoader 可能会抛出异常,LoadingCache.get(K) 方法会抛出 ExecutionException 异常。(如果 CacheLoader 抛出未经检查异常,get(K) 方法将抛出包装异常 UncheckedExecutionException)。也可以选择使用 getUnchecked(K) 方法,它将所有异常都包装在UncheckedExecutionException 中,但如果底层的 CacheLoader 抛出已检查异常,这可能导致意外行为。
LoadingCache<Long, String> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(new CacheLoader<Long, String>() {
@Override
public String load(Long key) {//抛出未检查异常
//TODO: 根据业务加载数据
return RandomStringUtils.randomAlphanumeric(10);
}
});
log.info(loadingCache.getUnchecked(1L));
复制代码
可以使用 getAll(Iterable
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4