8

最近、guava キャッシュを試してみて、エビクション ポリシーに驚きました。キャッシュはドキュメントでlruとして明確に述べられていますが、それは事実上のものではありません。私のテストが示すように、立ち退きはランダムに見えます。(テストは、100 エントリを追加し、100 エントリを取得し、異なる 100 エントリをポットし、エビクション順序を確認することです) 実行時に予期しないエビクションを検出したくありません。サイズが制限されたキャッシュのエビクション ポリシーの背後にある背景を教えてください。LHMのようにグアバキャッシュを強制的に削除するにはどうすればよいですか?

4

1 に答える 1

20

Guava キャッシュは、複数の同時読み取りおよび書き込みを可能にするために、異なるハッシュ テーブルに分割されます。concurrencyLevelデフォルトconcurrencyLevelは 4 です。基本的に、maximumSizeが に設定されている場合100、実際には 4 つのセグメントのそれぞれがmaximumSize25 になるだけです。これが、maximumSizeドキュメントに次のように記載されている理由です。

この制限を超える前に、キャッシュによってエントリが削除される場合があることに注意してください。キャッシュ サイズが最大値に近づくと、キャッシュは、再度使用される可能性が低いエントリを削除します。

そのため、たまたま 1 つの特定のセグメントに 30 のエントリがあった場合、そのうちの 5 つのエントリが削除されます。

のグローバルで最も最近アクセスされたエビクションを取得する唯一の方法Cacheは、 を設定して同時実行を完全にオフにすることですconcurrencyLevel(1)。それでも、ドキュメントは要素の削除順序を保証していないため、それに依存するべきではありません。

于 2012-04-19T20:33:08.833 に答える