-1

Javaでキャッシュを実現していますが、解決すべき最後の問題があります:要素の削除をどのように処理するのですか?

要素はディスクに保存されます。各要素には有効期間 (有効期限) とサイズがあります。私のキャッシュには、保存できる要素の最大サイズと最大数があります。

要素の削除を実行する 3 つの方法を想像しました。

  1. 新しい要素をキャッシュに挿入すると、スケジュールされたスレッド(各要素に 1 つ) が有効期限に開始するように構成されます (要素自体を削除するため)。
  2. X 分ごとにスレッドを実行して、どの要素が削除される可能性があるか (およびそれらを削除するか) を確認します。
  3. 制限 (サイズまたは数) に達すると、最も古い要素が削除されます (または要素をランダムに (より速く) 削除します)。

3 番目のポイントについて、このポリシーを使用すると、キャッシュは期限切れの要素も格納し続けます。明らかに、これらのいずれかが必要な場合、要素がまだ有効かどうかをチェックするために制御が実行されます。

についてどう思いますか?キャッシュを管理するときの一般的な動作は何ですか? 他の解決策はありますか?

PS Android 用にこのキャッシュを開発していますが、これはそれほど重要ではないと思います。

4

1 に答える 1

0

基本的に、キャッシュされた要素が使用される頻度と順序を知る必要があります。キャッシュは、最適なデータをメモリに保持するために OS と同じことを行う必要があります。

これらの戦略を見て、必要なものを選んでください: http://en.wikipedia.org/wiki/Page_replacement_algorithm

良いヒントは、LRU (Least-Recently-Used) です。しかし、これらすべての戦略と同様に、いくつかの欠点があります。これは、使用状況に適していない可能性があります。

LRU の実装のヒント:

PriorityQueue を使用して、マップに加えて要素を格納します。要素の 1 つを使用するたびにインクリメントされるグローバル カウンターで更新し続け、対応する要素をグローバル カウンターの現在の値で PriorityQueue に再挿入します。

キューからアイテムを削除する必要がある場合は、最初または最後の要素をキューから削除するだけです (compareTo(...) メソッドの実装によって異なります)。マップからも削除します。

于 2013-01-14T18:47:32.807 に答える