web-dev-qa-db-ja.com

誰かがGuava CacheLoaderを理解するのに役立ちますか?

私はGoogleのGuavaライブラリーを初めて利用し、Guavaのキャッシングパッケージに興味があります。現在、バージョン10.0.1をダウンロードしています。ドキュメンテーションを確認した後、JUnitはソースコードをテストし、グーグルを広範囲に検索した後でも、キャッシングパッケージの使用方法を理解できません。ドキュメントは、私のような初心者のためではなく、Guavaのライブラリを使用している人のために書かれたかのように、非常に短いものです。キャッシングパッケージを適切に使用する方法の実例がもっとあればよいのですが。

最短未使用(LRU)エビクションメソッドを使用して、有効期限のない10個のアイテムのキャッシュを構築するとします。したがって、APIにある例から、次のようなコードを作成します。

Cache<String, String> mycache = CacheBuilder.newBuilder()
   .maximumSize(10)
   .build(
       new CacheLoader<String, String>() {
         public String load(String key) throws Exception {
           return something; // ?????
         }
       });

CacheLoaderが必要なので、CacheBuilderのbuildメソッドに含める必要があります。しかし、mycacheから適切な値を返す方法がわかりません。

アイテムをmycacheに追加するには、次のコードを使用します。

mycache.asMap().put("key123", "value123");

Mycacheからアイテムを取得するには、次のメソッドを使用します。

mycache.get("key123")

Getメソッドは、mycacheから値を取得するのではなく、常にCacheLoaderのloadメソッドから返された値を返します。誰かが私が逃したものを親切に教えてくれませんか?

28
carbotex

GuavaのCacheタイプは、一般にcomputingキャッシュとして使用することを目的としています。通常、手動で値を追加することはありません。むしろ、必要なコードを含むCacheLoaderを与えることによって、キーの値を計算するために負荷がかかる方法をロードする方法を伝えます。

典型的な例は、データベースからの値のロードまたは負荷の高い計算の実行です。

_private final FooDatabase fooDatabase = ...;

private final LoadingCache<Long, Foo> cache = CacheBuilder.newBuilder()
    .maximumSize(10)
    .build(new CacheLoader<Long, Foo>() {
      public Foo load(Long id) {
        return fooDatabase.getFoo(id);
      }
    });

public Foo getFoo(long id) {
  // never need to manually put a Foo in... will be loaded from DB if needed
  return cache.getUnchecked(id);
}
_

また、あなたが与えた例を試してみましたが、mycache.get("key123")は_"value123"_を期待どおりに返しました。

38
ColinD