1. 序章

この記事では、グアバを紹介します CacheLoader。

さらに読む前に、まずLoadingCacheクラスの基本を理解しておくことをお勧めします。 これは、CacheLoaderが特に機能するためです。

基本的に、 CacheLoader は、GuavaLoadingCacheで値が見つからない場合に値を計算するために使用される関数です。

2. CacheLoaderLoadingCacheの使用

LoadingCacheでキャッシュミスが発生した場合、またはキャッシュを更新する必要がある場合は、CacheLoaderが値の計算に使用されます。 これは、キャッシュロジックを1つの場所にカプセル化するのに役立ち、コードをよりまとまりのあるものにします。

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");

ご覧のとおり、一度だけ呼び出されました。 値はまだ計算されていないため、初めてキャッシュされませんでした。 2回目は、前回の呼び出しからキャッシュされたため、 slowMethod()を再度呼び出すオーバーヘッドを回避できました。

2.3. キャッシュを更新する

キャッシュに関するもう1つの一般的な問題は、キャッシュの更新です。 最も難しいのは知ることですがいつキャッシュを更新するために、別の人が知っていますどうやって。

を解決するどうやって使用する場合は簡単です CacheLoader。 The LoadingCache 更新が必要な値ごとに呼び出すだけです。 テストでこれを試してみましょう:

String value = loadingCache.get("key");
loadingCache.refresh("key");

assertThat(callCount).isEqualTo(2);
assertThat(value).isEqualTo("key");

その後のget()の呼び出しとは異なり、refresh()は、 CacheLoader を再度呼び出すように強制し、値が最新であることを確認します。

3. 結論

この記事では、LoadingCacheCacheLoaderによってどのように使用され、キャッシュミスおよびキャッシュリフレッシュの値を計算するかについて説明しました。 GuavaCachingに関するこのより詳細な記事もチェックする価値があります。

これらの例の実装は、GitHubにあります。 これはMavenプロジェクトなので、そのまま実行するのは簡単です。