2011-11-05 36 views
19

Estoy usando el caché proporcionado por System.Runtime.Caching.MemoryCache.¿Puedo iterar sobre .NET4 MemoryCache?

me gustaría enumerar sobre los elementos de la caché para que pueda invalidar (desalojo a continuación, volver a cargar) elementos en cuanto tales

foreach (var item in MemoryCache.Default) { item.invalidate() } 

Pero los documentos oficiales found here Estado:

Importante: La recuperación de un enumerador para una instancia de MemoryCache es una operación de bloqueo y de uso intensivo de recursos . Por lo tanto, el enumerador debe no se debe utilizar en aplicaciones de producción.

Seguramente debe haber una forma simple y eficiente de iterar sobre los elementos de la caché?

+0

Quizás de alguna manera necesites saber de antemano qué cosas hay en el caché ... Pero esto significaría usar una matriz o algo así. – sinni800

+0

Sí, eso es lo que estoy haciendo ahora, ¡pero es una locura ya que significa que estoy rastreando lo que el caché ya está rastreando! :) –

+0

Exactamente. Pero si la memoria caché contiene la gran cantidad de datos y su matriz solo la información para ALCANZAR los datos que contiene bien. – sinni800

Respuesta

9

Las sugerencias hechas hasta ahora han sido geniales, pero mi necesidad sigue siendo la siguiente: para iterar sobre los elementos del caché. Parece una tarea tan simple, y espero que el caché internamente tenga algún tipo de estructura de listas de todos modos. Los documentos y la función establecidos para MemoryCache son deficientes.

Como mencioné anteriormente, he agregado una lista a mi clase de adaptador de caché, que contiene una referencia a cada elemento que coloco en el caché. Si necesito iterar sobre el caché, no solo para la invalidación, sino para recopilar estadísticas, etc., entonces repito sobre mi lista.

Si el número de elementos colocados en la memoria caché no cambia, entonces esta es una solución razonable. Si el número cambia, entonces necesita insertar/eliminar a través de la clase de adaptador, para mantener la lista sincronizada con la memoria caché real. Desordenado pero funciona, y evita las penalizaciones de perfusión aludidas en los documentos.

Esperemos que MemoryCache proveedor de caché se desarrolle en la próxima versión de la plataforma.

+0

Jeje, yo era demasiado lento :). ¡Sin preocupaciones! – sinni800

+1

Finalmente me di cuenta por qué la clase se escribió tal como era. Al iterar sobre el caché, puede encontrarse con una condición de carrera porque un objeto es expulsado durante la iteración. Entonces necesitas bloquear el caché. PERO, si tiene el caso de uso, como lo hice, donde establece que los artículos nunca caducan, entonces esto no es aplicable (por supuesto, mis artículos pueden ser desalojados de todos modos, debido a la poca memoria, pero ese es un caso de frontera si su caché es pequeño y estás usando un servidor moderno). –

+0

Más notas. Esto me hizo pensar que mi solución es bastante * peligrosa * y posiblemente estúpida. Es mucho más sensato aceptar el golpe de perforación, y permitir que el MemoryCache se bloquee durante la iteración, o usar de alguna otra forma para invalidar todos sus elementos. Si la memoria caché no se invalida a menudo, entonces está bien simplemente vivir con el golpe de perforación: solo piense en el tiempo que lleva calentar una caché, invalidar todo no es diferente. No obstante, los documentos advierten que no se debe usar el enumerador en el código de producción: me pregunto por qué? Quizás hay otros problemas que desconozco. –

1

Considere usar ChangeMonitors, que le permiten expulsar automáticamente las entradas obsoletas cuando se cumplen ciertas condiciones.

Ver Is there some sort of CacheDependency in System.Runtime.Caching?

Esto es similar a System.Web.Caching CacheDependencys, que le permiten desalojar entradas cuando los archivos u otras entradas de caché cambian.

-2

En 2014,

Ésta es la forma correcta de obtener todos los elementos:

Dim AllItems = MemoryCache.Default.Select(Of ItemType)(Function(O) O.Value)

Espero que esto ayude a alguien.

+2

Votación descendente. Esto es lo mismo que 'enumerar' los elementos de la memoria caché que, como los estados OP de la documentación oficial, son 'intensivos en recursos' y deben evitarse. Ver [El problema con la enumeración] (http://stackoverflow.com/a/22388943/219516). – publicgk

+0

Lo siento @publicgk No leí la pregunta por completo. – Dejisys

Cuestiones relacionadas