41

キャッシュに Google Guava ライブラリを使用しています。自動キャッシュ更新の場合、次のように実行できます。

cache = CacheBuilder.newBuilder()               
                    .refreshAfterWrite(15, TimeUnit.MINUTES)
                    .maximumSize(100)
                    .build(....);

ただし、エントリに対する最初の古いリクエストが発生すると、自動更新が実行されます

キャッシュ データのリクエストが来なくても、自動的に更新する方法はありますか? 同様に、誰かがキャッシュ データを呼び出したかどうかに関係なく、15 分ごとに Db からキャッシュ データを取得してロードする必要があります。

また、Guava のキャッシュ有効期限はキャッシュ全体に対するものです。キーに基づいてキャッシュ値を期限切れにすることは可能ですか? キー "NOT_SO_FREQ_CHANGE_DATA" を持つキャッシュ データは 1 時間ごとに期限切れになり、キー "FREQ_CHANGING_DATA" を持つデータは 15 分ごとに期限切れになる必要がありますか?

4

5 に答える 5

32

Guava には、キャッシュを一括で更新する方法はありませんが、定期的な更新を自分でスケジュールできます。

LoadingCache<K, V> cache = CacheBuilder.newBuilder()
        .refreshAfterWrite(15, TimeUnit.MINUTES)
        .maximumSize(100)
        .build(new MyCacheLoader());

for (K key : cache.asMap().keySet()) {
    cache.refresh(key);
}

ただし、その場合、CacheLoader.reload(K, V)メソッドをオーバーライドして、MyCacheLoader非同期で実行することができます。

2 番目の質問については、いいえ、Guava でエントリごとの有効期限を設定することはできません。

于 2012-07-13T08:30:16.540 に答える
11

並列ストリームを使用する Java 8 バージョン:

Executors
        .newSingleThreadScheduledExecutor()
        .scheduleWithFixedDelay(() -> configurationCache
                .asMap()
                .keySet()
                .parallelStream()
                .forEach((key) -> configurationCache.refresh(key)),
            0,
            1, TimeUnit.SECONDS);
于 2017-03-24T09:18:56.700 に答える
4

以下のコード スニペットを使用して、refresh メソッドを呼び出さずにキャッシュ値を自動的に再読み込みできますか??

cacher =
        CacheBuilder.newBuilder()
            .refreshAfterWrite(10, TimeUnit.SECONDS)
          .build(CacheLoader.asyncReloading(new CacheLoader<String, String>() {

              @Override
              public String load(String key) throws Exception {
                return method-call();
              }
            }, Executors.newSingleThreadExecutor()));
于 2020-03-31T04:23:33.510 に答える