Guava CacheLoaderの紹介

Guava CacheLoaderの概要

1. 前書き

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

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

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

2. LoadingCacheCacheLoaderを使用する

LoadingCache,でキャッシュミスが発生した場合、またはキャッシュを更新する必要がある場合は、CacheLoaderが値の計算に使用されます。 これにより、キャッシングロジックを1か所にカプセル化して、コードの凝集度を高めることができます。

2.1. メーベン依存

まず、Mavenの依存関係を追加しましょう。


  com.google.guava
  guava
  21.0

最新バージョンはMaven repositoryにあります。

2.2. 値の計算とキャッシュ

それでは、CacheLoaderを使用してLoadingCacheをインスタンス化する方法を見てみましょう。

LoadingCache loadingCache = CacheBuilder.newBuilder()
  .build(new CacheLoader() {
    @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つの一般的な問題は、キャッシュの更新です。 最も難しいのはキャッシュを更新するためにwhenを知ることですが、別の側面はhow.を知ることです

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

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

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

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

3. 結論

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

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