2009-04-01 13 views
11

Ich füge dem ASP.NET-Cache eine Reihe von Elementen mit einem bestimmten Präfix hinzu. Ich möchte in der Lage sein, über den Cache zu iterieren und diese Elemente zu entfernen.Entfernen bestimmter Elemente aus dem Cache (ASP.NET)

Die Art und Weise habe ich versucht zu tun, ist es etwa so:

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

Kann ich effizient dies tun?

Ich hatte überlegt, eine temporäre Datei zu erstellen und die Elemente mit einer Abhängigkeit von der Datei hinzuzufügen, dann lösche ich nur die Datei. Ist das über tödlich?

Antwort

19

Sie können keine Elemente aus einer Sammlung entfernen, während Sie über sie iterieren, so dass Sie so etwas tun:

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); 
} 

Dieser Ansatz ist in Ordnung und ist schneller und einfacher als Cache-Abhängigkeiten.

+0

Das war, wovor ich Angst hatte. Danke –

+0

Schön gemacht. In der nächsten Version von .NET möchte ich jedoch die Remove-Methode für ALLE Auflistungen sehen, die reguläre Ausdrücke als Eingabe verwenden. – Vnuk

+1

Lambda würde noch besser funktionieren. – Audrius

2

Sie könnten eine Unterklasse von CacheDependency schreiben, die die Ungültigkeitserklärung entsprechend durchführt.

0

Es hängt wirklich von der Anzahl Ihrer Cache-Elemente und wie oft Sie die Bereinigung tun. Ich würde mich nur darum kümmern, wenn es sich tatsächlich um ein Leistungsproblem handelte - also um es zu messen.

Ihre Lösung ist gut für mich, wenn Sie etwas extremes tun.

0

Für die Cache-Bereinigung nehme ich an, dass Sie es manuell ausführen müssen, wenn Sie feststellen, dass zu viele Cache-Elemente vorhanden sind. Mit MS lib Cache-Block kann dies automatisch für Sie arbeiten. In der CachingConfiguration; Sie können die Eigenschaft maximumElementsInCacheBeforeScavenging festlegen; Sobald die Anzahl der Cache-Elemente den Grenzwert überschritten hat, löscht der Cache-Manager den Cache automatisch.

1

Sie sollten nur zu diesem Zweck ein anderes Objekt im Cache behalten. Nehmen wir an, Sie cachen 10.000 Elemente mit Schlüsseln wie: cache_prefix_XXX. Wenn Sie also ein Element nur mit cache_prefix als Schlüssel hinzufügen und den Rest mit einer Abhängigkeit von diesem Schlüssel hinzufügen, können Sie die Entfernung aller Elemente steuern. Eine Sache, die berücksichtigt werden sollte, wären die Prioritäten. Legen Sie diesem bestimmten Element eine höhere Priorität als die tatsächlichen Datenelemente fest.

Verwandte Themen