2009-04-01 19 views
11

Estoy agregando un montón de elementos a la memoria caché de ASP.NET con un prefijo específico. Me gustaría poder iterar sobre la memoria caché y eliminar esos elementos.Eliminar elementos específicos de Caché (ASP.NET)

La forma en que he tratado de hacerlo es así:

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

podría estar haciendo esto de manera más eficiente?

Consideré crear un archivo temporal y agregar los elementos con dependencia del archivo, y luego simplemente eliminar el archivo. ¿Eso es más de matar?

Respuesta

19

No se puede eliminar elementos de una colección, mientras que usted está iterando sobre él por lo que hay que hacer algo como esto:

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

Este enfoque está muy bien y es más rápido y más fácil que las dependencias de caché.

+0

De eso tenía miedo. Gracias –

+0

Bien hecho. Aunque, en la próxima versión de .NET, me gustaría ver el método Eliminar en TODAS las colecciones que toma la expresión regular como entrada. – Vnuk

+1

Lambda funcionaría aún mejor. – Audrius

2

Puede escribir una subclase de CacheDependency que invalide apropiadamente.

0

Realmente depende de la cantidad de elementos de su caché y de la frecuencia de la limpieza. Me preocuparía solo si realmente era un problema de rendimiento, es decir, medirlo.

Su solución está bien para mí a menos que esté haciendo algo extremo.

0

Para la limpieza de la caché, supongo que debe ejecutarla manualmente cuando observe que hay demasiados elementos de la memoria caché. Usando MS lib cache block, puede hacer este trabajo automáticamente. En cachingConfiguration; puede establecer la propiedad maximumElementsInCacheBeforeScavenging; una vez que la cantidad de elementos de la memoria caché supera el límite, el administrador de la memoria caché eliminará automáticamente la memoria caché.

1

Debe guardar otro elemento en la memoria caché solo para este propósito. Digamos que almacena en caché 10.000 elementos con claves como: cache_prefix_XXX. Entonces, al agregar un elemento con solo cache_prefix como su clave y agregar el resto de ellos con una dependencia de esta clave, puede controlar la eliminación de todos ellos. Una cosa a considerar serían las prioridades. Establezca ese artículo particular una prioridad más alta que los elementos de datos reales.

Cuestiones relacionadas