Contents

Guava Cacheloader简介

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,确保我们的值是最新的。