5

Cache次のように定義されている があるとします。

private static Cache<String, Long> alertsUIDCache = CacheBuilder.newBuilder().
           expireAfterAccess(60).build();

私が読んだものから(間違っている場合は修正してください):

値がCache0:00 に書き込まれた場合、60 秒後に「削除準備完了」ステータスに移行する必要があります。からの値の実際の削除はCache、次のキャッシュの変更時に行われます(キャッシュの変更とは正確には何ですか?)。そうですか?

invalidateAll()また、メソッドとメソッドの違いがわかりませんcleanUp()。誰かが説明を提供できますか?

4

1 に答える 1

9

このリンクの最初の部分: Guava は CacheBuilder のエントリをどのように期限切れにしますか?

今回はexpireAfterAccessに焦点を当てますが、expireAfterWrite の手順はほぼ同じです。メカニズムに関しては、 CacheBuilderで expireAfterAccessを指定すると、キャッシュの各セグメントは、最新アクセスから最新アクセスの順にエントリのリンク リスト アクセス キューを維持します。キャッシュ エントリは、実際にはリンク リスト内のノードであるため、エントリがアクセスされると、アクセス キュー内の古い位置から移動し、キューの最後に移動します。

2番目の部分: このリンクから: Guava CacheLoader - expireAfterWrite と expireAfterAccess の両方が設定されている場合、無効化はすぐにエントリを無効にしません

invalidate別のクエリを待たずに、すぐにエントリを削除し、そのキーへの次のクエリで値を強制的に再ロードする必要があります。

cleanUp: キャッシュに必要な保留中のメンテナンス操作を実行します。正確にどのアクティビティが実行されるか (もしあれば) は、実装に依存します。

グアバ文書から: https://github.com/google/guava/wiki/CachesExplained

明示的な削除

エントリが削除されるのを待つのではなく、いつでも明示的にキャッシュ エントリを無効にすることができます。これを行うことができます:

individually, using Cache.invalidate(key)
in bulk, using Cache.invalidateAll(keys)
to all entries, using Cache.invalidateAll()

クリーンアップはいつ行われますか?

CacheBuilder で構築されたキャッシュは、クリーンアップを実行せず、値を「自動的に」または値の有効期限が切れた直後に削除したり、そのようなものを削除したりしません。代わりに、書き込み操作中、または書き込みがまれな場合は時折の読み取り操作中に少量のメンテナンスを実行します。

その理由は次のとおりです。キャッシュのメンテナンスを継続的に実行したい場合、スレッドを作成する必要があり、その操作は共有ロックのユーザー操作と競合します。さらに、一部の環境ではスレッドの作成が制限されているため、その環境では CacheBuilder が使用できなくなります。

代わりに、私たちはあなたの手に選択を任せます。キャッシュのスループットが高い場合は、期限切れのエントリなどをクリーンアップするためにキャッシュのメンテナンスを実行することを心配する必要はありません。キャッシュの書き込みがほとんどなく、クリーンアップでキャッシュの読み取りをブロックしたくない場合は、定期的に Cache.cleanUp() を呼び出す独自のメンテナンス スレッドを作成することをお勧めします。

書き込みがほとんどないキャッシュの定期的なキャッシュ メンテナンスをスケジュールする場合は、ScheduledExecutorService を使用してメンテナンスをスケジュールするだけです。

于 2016-12-12T16:55:59.780 に答える