4

現在ConcurrentHashMap、アプリケーションで を使用していますが、タイムアウト期間後にエントリを効率的に期限切れにする機能 (expireAfterWrite) を追加し、エントリが削除されるたびに削除リスナーに通知する必要があります。

必要なものを提供できることがわかりましたCacheBuilderが、キャッシュではなくマップが必要なため、使用するのをためらっています。グアバキャッシュのドキュメントがこれを言っているので、私はこれを言います(マップとキャッシュの違い)

一般に、Guava キャッシング ユーティリティは次の場合に適用できます。

  • 速度を向上させるためにいくらかのメモリを費やすことを厭わない。
  • キーが複数回クエリされることがあると予想されます。
  • 原則として、すべての値がキャッシュからすぐに削除された場合、アプリケーションは機能しますが、重複する作業を削減しようとしています。

具体的には、私のアプリケーションでは 3 番目の箇条書きが適切ではありません。後で(有効期限が切れるまで)取得したい値をマップ/キャッシュに保存しています。また、通常、私のキーは 1 回か 2 回しかクエリされず、キャッシュの利点を確認できる回数は多くありません。つまり、私の要件はある意味でキャッシュではなく、マップに対するものであることがわかります。CacheBuilder をマップとして使用して、expireAfterWrite の値を格納し、removalListener 機能を提供することはまだ良い考えですか? アドバイスを提供できる CacheBuilder 実装の内部について十分に知っている人はいますか?

4

1 に答える 1

3

編集:もちろんMapMaker、キャッシング機能は推奨されていませんCacheBuilder。それを使用することをためらわないでください:

Cache<Key, Graph> graphs = CacheBuilder.newBuilder()
    .concurrencyLevel(4) // read docs for more details
    .expireAfterWrite(yourExpireTime, TimeUnit.MINUTES)
    .build();

次にCache#asMap()、ConcurrentMap としてのビューが必要な場合に使用します。

Guava - MapMakerの別のユーティリティを使用します。ドキュメントから:

次の機能の任意の組み合わせを持つ ConcurrentMap インスタンスのビルダー:

  • 弱参照またはソフト参照で自動的にラップされるキーまたは値
  • 最大サイズを超えたときの、最近使用されていないエビクション
  • 最後のアクセスまたは最後の書き込み以降に測定されたエントリの時間ベースの有効期限
  • 削除された (または削除された) エントリの通知
  • まだ存在しないキーの値のオンデマンド計算

(...)

返されるマップは、ConcurrentHashMap と同様のパフォーマンス特性を持つハッシュ テーブルとして実装されます。ConcurrentMap インターフェースのすべてのオプション操作をサポートします。null キーまたは null 値は許可されません。

于 2012-06-21T18:53:50.023 に答える