net framework cache c# .net caching .net-4.0 memorycache

c# - framework - cache net



Usar instancias mĂșltiples de MemoryCache (2)

Me gustaría agregar capacidades de almacenamiento en caché a mi aplicación utilizando el System.Runtime.Caching nombres System.Runtime.Caching , y probablemente quiera usar el almacenamiento en caché en varios lugares y en diferentes contextos. Para hacerlo, quiero usar varias instancias de MemoryCache.

Sin embargo, veo here que se desaconseja usar más de una instancia de MemoryCache:

MemoryCache no es un singleton, pero debe crear solo algunas o potencialmente solo una instancia de MemoryCache y el código que almacena elementos en caché debe usar esas instancias.

¿Cómo afectarían varias instancias de MemoryCache a mi aplicación? Encuentro este tipo de extraño porque me parece que usar múltiples cachés en una aplicación es un escenario bastante común.

EDITAR: Más específicamente, tengo una clase que debe mantener un caché para cada instancia. ¿Debo evitar usar MemoryCache y buscar una solución de almacenamiento en caché diferente? Está usando MemoryCache en esta situación considerada mala, y si es así, ¿por qué?


Recientemente también lo hice yo mismo. Teniendo en cuenta que un caché en memoria será específico del proceso (no compartido en varias instancias de un sitio web o aplicación empresarial nativa o múltiples servidores), no hay ningún beneficio de tener múltiples instancias de MemoryCache excepto por razones de código organizacional (que se puede lograr de otras maneras) .

El caché de memoria está destinado a ser utilizado solo principalmente debido a sus capacidades de gestión de memoria. Además de los contadores de rendimiento (que tienen cierta sobrecarga), MemoryCache también puede caducar los artículos cuando se queda sin memoria asignada.

Si la instancia actual de la memoria caché excede el límite de memoria establecido por la propiedad CacheMemoryLimit, la implementación de la memoria caché elimina las entradas de la memoria caché. Cada instancia de caché en la aplicación puede usar la cantidad de memoria especificada por la propiedad CacheMemoryLimit.

de MemoryCache.CacheMemoryLimit Property

Al usar solo una instancia de MemoryCache, puede aplicar esta administración de memoria de manera eficiente en toda la instancia de la aplicación. Expiración de los elementos menos importantes en toda la aplicación. Esto asegura el máximo uso de la memoria, sin exceder las capacidades de su hardware. Al limitar el alcance de una MemoryCache (como una instancia de una clase), ya no puede administrar la memoria de manera efectiva para su aplicación (ya que no puede "ver" todo). Si todos estos cachés estuvieran "ocupados" puede que le cueste más administrar la memoria y nunca será tan eficiente.

Esto es particularmente sensible en aplicaciones que no tienen el lujo de un servidor dedicado. Imagine que está ejecutando su aplicación en un servidor compartido donde solo le han asignado 150 mb de RAM (alojamiento común barato a $ 10 por mes) necesita contar con su caché para usarla al máximo sin excederlo. Si supera este uso de memoria, su grupo de aplicaciones se reciclará y su aplicación perderá todo en cachés de memoria. (Práctica común de alojamiento barato) Lo mismo podría aplicarse a una aplicación no web alojada en la casa en algún servidor corporativo compartido. El mismo trato, se te dice que no tengas que almacenar toda la memoria en esa máquina y coexistir pacíficamente con otras aplicaciones de la línea de negocios.

Ese límite de memoria, reciclar el grupo de aplicaciones, perder cachés es un "talón de Aquiles" común para las aplicaciones web. Cuando las aplicaciones están más ocupadas, se reinician con mayor frecuencia debido a la exageración de las asignaciones de memoria, la pérdida de todas las entradas de caché y, por lo tanto, hacer la mayor parte del trabajo de recuperación de cosas que deberían haberse almacenado en el caché en primer lugar. Lo que significa que la aplicación realmente pierde rendimiento a la carga máxima en lugar de ganar.

Sé que MemoryCache es la versión no específica de la web de la implementación de System.Web.Caching.Cache, pero esto ilustra la lógica detrás de la implementación de la memoria caché. La misma lógica puede aplicarse en un proyecto que no sea web si no tiene un uso exclusivo del hardware. Recuerde que si su caché fuerza a la máquina a comenzar a hacer intercambios de archivos de paginación, entonces su caché ya no es más rápida que el almacenamiento en caché del disco. Siempre querrás un límite en alguna parte, incluso si ese límite es de 2 GB o algo así.

En mi caso, después de leer acerca de esto, cambié a usar una ''MemoryCache estática pública'' en mi aplicación y simplemente segregé los elementos en caché por sus claves de caché. Por ejemplo, si desea almacenar en caché una instancia por instancia, podría tener una clave de caché como algo como "instancia- {ID de instancia} -nombre de recurso- {ID de recurso}". Piense en ello como el espaciado entre sus entradas de caché.

¡Espero que ayude!


Yo uso varios también. Generalmente uno por tipo.

Al mirar MemoryCache veo que se engancha en eventos AppDomain y mantiene contadores de rendimiento. Sospecho que hay un poco de recursos generales por el uso de más de uno (por ejemplo, CPU, contadores y memoria) y es por eso que se desaconseja.