Guava Cacheloader简介
Contents
1. 简介
在本文中,我们将介绍 Guava CacheLoader 。
在进一步阅读之前,建议先对*LoadingCache 类有一个基本的了解。这是因为CacheLoader*专门使用它。
本质上,CacheLoader是一个用于在 Guava *LoadingCache *中找不到值时计算值的函数。
2. 使用带有LoadingCache的CacheLoader
当LoadingCache 发生缓存未命中,或者缓存需要刷新时,CacheLoader将用于计算值。这有助于将我们的缓存逻辑封装在一个地方,使我们的代码更具凝聚力。
2.1. Maven 依赖
首先,让我们添加我们的 Maven 依赖项:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
您可以在Maven 存储库 中找到最新版本。
2.2. 计算和缓存值
现在,让我们看看如何使用CacheLoader实例化LoadingCache:
LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder()
.build(new CacheLoader<String, String>() {
@Override
public String load(final String s) throws Exception {
return slowMethod(s);
}
});
本质上,当LoadingCache需要计算一个尚未缓存的值时,它会调用我们的内联CacheLoader 。让我们尝试计算当我们多次从缓存中检索某些内容时,我们的*slowMethod()*被调用了多少次:
String value = loadingCache.get("key");
value = loadingCache.get("key");
assertThat(callCount).isEqualTo(1);
assertThat(value).isEqualTo("expectedValue");
正如我们所见,它只被调用过一次。第一次未缓存该值,因为它尚未计算。第二次,它是从上一次调用中缓存的,所以我们可以避免再次调用我们的*slowMethod()*的开销。
2.3. 刷新缓存
缓存的另一个常见问题是刷新缓存。虽然最困难的方面是知道何时刷新缓存,但另一个方面是知道如何。
使用CacheLoader时解决方法很简单。LoadingCache将简单地为每个需要刷新的值调用它。让我们通过测试来试试这个:
String value = loadingCache.get("key");
loadingCache.refresh("key");
assertThat(callCount).isEqualTo(2);
assertThat(value).isEqualTo("key");
与我们随后对get() 的调用不同,refresh()将强制再次调用CacheLoader,确保我们的值是最新的。