Recientemente, he pasado por esto yo también. 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 en tener múltiples MemoryCache
instancias, excepto por razones organizativas del código (que se pueden 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 caché excede el límite de memoria de ajuste directamente en el hotel CacheMemoryLimit, la implementación de caché elimina entradas de caché. Cada instancia de caché en la aplicación puede usar la cantidad de memoria especificada por la propiedad CacheMemoryLimit.
de MemoryCache.CacheMemoryLimit Property
Mediante el uso de sólo una instancia de la MemoryCache se puede aplicar esta gestión de memoria de manera eficiente a través de toda la instancia de 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, reciclaje de 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 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!
¿Cuál es la diferencia entre un solo caché y muchos cachés? Después de todo, todos van a hacer lo mismo. – spender
Por un lado, no tendré que preocuparme tanto por las colisiones clave. Además, creo que es más organizado y más fácil de depurar que tener un objeto que contenga todo lo que la aplicación almacena en caché. –
Significa que no debe crear muchos cachés que almacenan en caché lo mismo. Es mucho mejor almacenar en caché todo lo que sea posible con un caché central. Pero está perfectamente bien crear muchos cachés que hacen caché de cosas diferentes. –