2009-04-01 23 views
11

ASP.NETキャッシュに特定のプレフィックスを持つ項目を追加しています。 キャッシュを繰り返し処理してこれらのアイテムを削除したいと考えています。キャッシュから特定の項目を削除する(ASP.NET)

私はそれを行うには試した方法はとても似ている:

foreach (DictionaryEntry CachedItem in Cache) 
    { 
     string CacheKey = CachedItem.Key.ToString(); 
     if(CacheKey.StartsWith(CACHE_PREFIX){ 
      Cache.Remove(CacheKey); 
     } 
    } 

は私がより効率的にこれをやっていませんか?

私は一時ファイルを作成し、単にファイルを削除、ファイルに依存して項目を追加すると考えられていました。それは殺し過ぎですか?

答えて

19

あなたはそれを反復している間、あなたはこのような何かをする必要があるので、あなたは、コレクションから項目を削除することはできません。

List<string> itemsToRemove = new List<string>(); 

IDictionaryEnumerator enumerator = Cache.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 
    if (enumerator.Key.ToString().ToLower().StartsWith(prefix)) 
    { 
     itemsToRemove.Add(enumerator.Key.ToString()); 
    } 
} 

foreach (string itemToRemove in itemsToRemove) 
{ 
    Cache.Remove(itemToRemove); 
} 

をこのアプローチは罰金で、キャッシュの依存関係よりも迅速かつ簡単です。キャッシュがクリーンアップのために

+0

これは私が恐れていたものです。 ありがとう –

+0

きれいに行われました。 NETの次のバージョンでは、入力として正規表現を取るすべてのコレクションのRemoveメソッドを見たいと思いますが。 – Vnuk

+1

ラムダはもっとうまくいくでしょう。 – Audrius

2

あなたが適切に無効化を行いCacheDependencyのサブクラスを書くことができます。

0

それは本当にあなたのキャッシュアイテムの数や頻度、あなたがクリーンアップを行うに依存します。私はそれが実際にパフォーマンス上の問題だった場合にのみ、それを心配しています。あなたは極端な何かをやっている場合を除き

あなたのソリューションは、私には結構です。

0

、私はあなたがあまりにも多くのキャッシュ項目がある気づくとき手動で実行する必要がありますと仮定します。 MS libキャッシュブロックを使用すると、自動的にこの作業を行うことができます。 cachingConfigurationでは、プロパティmaximumElementsInCacheBeforeScavengingを設定できます。キャッシュ項目の数が制限を超えると、キャッシュマネージャは自動的にキャッシュを消去します。

1

にのみ、この目的のためにキャッシュに別の項目を維持する必要があります。 cache_prefix_XXXのようなキーで10.000個のアイテムをキャッシュするとしましょう。したがって、キーにcache_prefixだけの項目を追加し、残りのキーにこのキーの依存関係を追加すると、それらのすべての削除を制御できます。考慮すべきことの1つが優先事項です。その特定の項目を実際のデータ項目よりも高い優先順位に設定します。

関連する問題