3

キャッシュとして機能する素敵な小さなクラスを作成しました。各アイテムには有効期限の TimeSpan または DateTime があります。キャッシュ内のアイテムにアクセスしようとするたびに、アイテムの有効期限がチェックされ、有効期限が切れている場合、アイテムはキャッシュから削除され、何も返されません。

これは、頻繁にアクセスされるオブジェクトには最適ですが、項目がキャッシュに置かれ、二度とアクセスされない場合は、有効期限が切れていても決して削除されません。

そのようなアイテムをキャッシュから期限切れにするための良い方法は何ですか?

有効期限が切れているかどうかを確認するために、キャッシュ内のすべてのアイテムを無限に列挙するバックグラウンド スレッドを用意する必要がありますか?

4

5 に答える 5

5

最良のコードはノーコードです。代わりに ASP.NET キャッシュを使用してください。Web アプリケーションだけでなく、任意のアプリケーションで System.Web.HttpRuntime.Cache として参照できます。

于 2008-09-26T21:36:23.093 に答える
1

LRU (最近使用されていない) 戦略を実装し、アイテムをアクセス時間順に並べ替え、新しいアイテムがキャッシュに挿入され、キャッシュがいっぱいになったときに、そのリストの最後のアイテムを削除することができます。ウィキペディアのキャッシュ アルゴリズムを参照してください。

すぐに期限切れにしたい場合は、物事がアクセスされたときにのみそれを行います. つまり、キャッシュ オブジェクトがアクセスされ、期限が切れたときに再取得します。

于 2008-09-26T19:37:04.970 に答える
1

また、キャッシュに変更を加えたときに、間隔を最も近い有効期限のタイムスタンプに設定してタイマーを (再) 開始することもできます。これはミリ秒単位の精度ではなく、実行中のメッセージ ポンプに依存しますが、リソースをあまり消費しません。

ただし、キャッシュが更新されていないときに、オブジェクトが永遠にぶら下がっていることを気にしない場合は、Harald Scheirich の回答の方が優れています。

于 2008-09-26T19:38:11.490 に答える
1

アイテムが最後にクリアされてから 1 分後の最初のアクセスで、適切に古いアイテムをキャッシュからクリアできます。

private DateTime nextFlush;
public object getItem(object key)
{
  DateTime now = DateTime.Now
  if (now > nextFlush)
  {
    Flush();
    nextFlush = now.AddMinutes(1)
  }
  return fetchItem(key);
}
于 2008-09-26T19:40:21.843 に答える
1

私の経験では、カスタム キャッシング メカニズムを維持することは、価値がある以上に面倒になりました。これらの問題をすでに解決しているライブラリがいくつかあります。そのうちの1つを使用することをお勧めします。.Net で人気のあるのは Enterprise Library ですが、そのキャッシング機能についてはあまり経験がありません。

カスタム キャッシュ メカニズムを使用する必要がある場合は、あなたが提案した注意深いスレッドのアイデアに問題はないと思います。つまり、アプリケーションがサーバーベースのアプリケーションであり、Web アプリケーションではない場合です。Web アプリの場合は、スライド式の有効期限が既に組み込まれています。次に、強く型付けされたラッパーでラップするだけで、キャッシュ項目を毎回キーで参照することを回避できます。

于 2008-09-26T19:41:41.137 に答える