1

アプリケーションに複数の Cache オブジェクトが必要で、最大の重みを共有したいと考えています。したがって、総重量 X が与えられた場合、すべてのキャッシュでキャッシュされたアイテムの重量の合計が X を超えないようにしたいと思います。事前に必要なキャッシュの数も、キャッシュの数もわかりません。 「公正」 -- 1 つが頻繁に使用され、他が使用されていない場合、グローバル最大値の大部分を占めることができるはずです。他のキャッシュがほとんど使用されていない間、キャッシュがいっぱいであると見なされ、そのスペースが頻繁に使用されるキャッシュによって割り当てられる可能性があるため、キャッシュのミスは望ましくありません。これにより、データを取得するためにディスクに戻ることができなくなるため、ミス率が低いことが重要です。

キャッシュされた重みの合計を保持する静的変数を使用する Weigher の実装を検討しました。次に、計量器はオブジェクトの重量を返します。その重量が残りのスペースの合計よりも小さい場合は、重量をそのまま返します。残りの合計重量を超えている場合は、Long.MAX_VALUE を返すことができるため、アイテムはキャッシュされません。各キャッシュには、おそらく Long.MAX_VALUE-1 という高い最大重みがあり、要素の重みを計算/割り当てることができる限り、要素を常に挿入できます。

問題は、キャッシュされたオブジェクトの総重量を知る方法が見当たらないことです。エビクションリスナーを使用して合計重量を減らすことはできますが、何かがキャッシュに挿入されたときに通知されることを確認する方法はありません。また、キャッシュ統計がこれをデータに反映することもありません。

この機能を実現するための回避策やアプローチはありますか? グローバルな重みを処理するカスタム キャッシュの実装がありますが、Guava キャッシュによって提供される機能の多くが欠けているため、可能であれば再実装を避けたいと考えています。一般的な方向性を教えていただければ、これをグアバキャッシュに配線しようとしてもかまいません。

4

2 に答える 2

2

解決策は 1 つだけです。何らかの複合キーを使用して、これらを 1 つのキャッシュに組み合わせることができますか?

于 2012-04-11T02:34:11.707 に答える
2

Guava キャッシュは相互にまったくやり取りしません。「グローバル」なやり取りはありませんがsoftValues()、ソフト参照は GC によって収集されるため (通常はグローバルで最も古いもの)、「メモリに依存する」キャッシュを作成する従来の方法です。 -使用順序)、ただしメモリが不足している場合のみ。

Guava キャッシュが内部的に総重量を追跡しているとは思えません。セグメントごとに総重量を追跡していると思いますが、総重量を追跡するにはあまりにも多くのロックが必要になります。

于 2012-04-10T15:54:20.420 に答える