web-dev-qa-db-ja.com

GuavaはCacheBuilderのエントリをどのように期限切れにしますか?

ここで推奨されているように、CacheBuilderを使用したいと思います。

有効期限が切れるキーを持つJava時間ベースのマップ/キャッシュ

しかし、私はいつグアバがエントリの有効期限を知っているのかわかりません。

Guavaはどのようにそれを行い、どのようなパフォーマンスコストが発生しますか?

27
Cedric Martin

グアバチームのメンバーはこちら。

Guava Cache実装は、通常のメンテナンス操作の過程でエントリの有効期限が切れます。これは、キャッシュ書き込み操作中にセグメントごとに発生し、場合によってはキャッシュ読み取り操作中に発生します。エントリは通常、正確に有効期限ではありません。これは、Cacheが独自のメンテナンススレッドを作成するのではなく、継続的なメンテナンスを行うかどうかをユーザーに決定させるためです。必須。

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

キャッシュのメンテナンスが実行されるとき、キャッシュがしなければならないのは、期限切れになっていないエントリが見つかるまで、キューの先頭にあるすべてのエントリを期限切れにすることだけです。これは簡単で、必要なオーバーヘッドは比較的少なく、通常のキャッシュメンテナンスの過程で発生します。 (さらに、キャッシュは1回のクリーンアップで実行される作業量を意図的に制限し、1回のキャッシュ操作の費用を最小限に抑えます。)通常、キャッシュメンテナンスのコストは、キャッシュ内の実際のエントリを計算するコストによって支配されます。

48
Louis Wasserman