ここで推奨されているように、CacheBuilderを使用したい:
有効期限が切れるキーを使用したJava時間ベースのマップ/キャッシュ
ただし、 Guavaがエントリの期限切れを知っている時期がわかりません。
Guavaはどのようにそれを行い、どのようなパフォーマンスコストが発生しますか?
ここで推奨されているように、CacheBuilderを使用したい:
有効期限が切れるキーを使用したJava時間ベースのマップ/キャッシュ
ただし、 Guavaがエントリの期限切れを知っている時期がわかりません。
Guavaはどのようにそれを行い、どのようなパフォーマンスコストが発生しますか?
グアバチームのメンバーはこちら。
GuavaのCache
実装は、通常のメンテナンス操作の過程でエントリを期限切れにします。これは、キャッシュの書き込み操作中にセグメントごとに発生し、場合によってはキャッシュの読み取り操作中に発生します。エントリは通常、独自のメンテナンススレッドを作成するのではなく、継続的なメンテナンスが必要かどうかをユーザーに判断させるために、意図的に有効期限が切れることはありません。Cache
に焦点を当てますexpireAfterAccess
が、の手順expireAfterWrite
はほとんど同じです。メカニズムの観点から、で指定するexpireAfterAccess
とCacheBuilder
、キャッシュの各セグメントは、エントリのリンクリストアクセスキューを、最新アクセスから最新アクセスの順に維持します。キャッシュエントリは、実際にはリンクリスト内のノードであるため、エントリにアクセスすると、アクセスキュー内の古い位置から自分自身を削除し、キューの最後に移動します。
キャッシュのメンテナンスが実行されるとき、キャッシュがしなければならないのは、期限切れになっていないエントリが見つかるまで、キューの先頭にあるすべてのエントリを期限切れにすることだけです。これは簡単で、必要なオーバーヘッドは比較的少なく、通常のキャッシュメンテナンスの過程で発生します。(さらに、キャッシュは1回のクリーンアップで実行される作業量を意図的に制限し、1回のキャッシュ操作の費用を最小限に抑えます。)通常、キャッシュメンテナンスのコストは、キャッシュ内の実際のエントリを計算するコストによって支配されます。