HttpRuntime.Cache
obtiene el Cache
para la aplicación actual.
La MemoryCache
clase es similar a la Cache
clase ASP.NET .
La MemoryCache
clase tiene muchas propiedades y métodos para acceder a la caché que le resultarán familiares si ha utilizado la Cache
clase ASP.NET .
La principal diferencia entre HttpRuntime.Cache
y MemoryCache
es que este último se ha cambiado para que sea utilizable por aplicaciones .NET Framework que no son aplicaciones ASP.NET.
Para lectura adicional:
Actualización:
Según los comentarios de los usuarios, a veces el blog de Jon davis no funciona, por lo que he puesto todo el artículo como una imagen.
Nota: Si no está claro, simplemente haga clic en la imagen, luego se abrirá en un navegador, luego haga clic nuevamente para hacer zoom :)
Aquí está el artículo de Jon Davis. Para preservar la legibilidad, estoy eliminando la sección EntLib ahora obsoleta, la introducción y la conclusión.
Caché ASP.NET
ASP.NET, o el ensamblado System.Web.dll, tiene un mecanismo de almacenamiento en caché. Nunca tuvo la intención de usarse fuera de un contexto web, pero puede usarse fuera de la web, y realiza todos los comportamientos de expiración anteriores en una especie de tabla hash.
Después de buscar en Google, parece que bastantes personas que han discutido la funcionalidad de almacenamiento en caché incorporada en .NET han recurrido al uso de la caché ASP.NET en sus proyectos que no son web. Este ya no es el sistema de almacenamiento en caché integrado más disponible y más compatible en .NET; .NET 4 tiene un ObjectCache al que entraré más adelante. Microsoft siempre ha insistido en que la caché ASP.NET no está diseñada para usarse fuera de la web. Pero muchas personas todavía están atrapadas en .NET 2.0 y .NET 3.5, y necesitan algo con qué trabajar, y esto funciona para muchas personas, aunque MSDN dice claramente:
La clase para el caché ASP.NET es System.Web.Caching.Cache en System.Web.dll. Sin embargo, no puede simplemente renovar un objeto Cache. Debe adquirirlo de System.Web.HttpRuntime.Cache.
El trabajo con la caché de ASP.NET se documenta en MSDN aquí .
Pros:
Contras:
ObjectCache / MemoryCache de .NET 4.0
Microsoft finalmente implementó una clase ObjectCache abstracta en la última versión de .NET Framework, y una implementación de MemoryCache que hereda e implementa ObjectCache para propósitos de memoria en una configuración no web.
System.Runtime.Caching.ObjectCache está en el ensamblado System.Runtime.Caching.dll. Es una clase abstracta que declara básicamente las mismas interfaces de estilo .NET 1.0 que se encuentran en la caché ASP.NET.
System.Runtime.Caching.MemoryCache
es la implementación en memoria de ObjectCache y es muy similar a la caché ASP.NET, con algunos cambios.Para agregar un artículo con un vencimiento deslizante, su código se vería así:
var config = new NameValueCollection(); var cache = new MemoryCache("myMemCache", config); cache.Add(new CacheItem("a", "b"), new CacheItemPolicy { Priority = CacheItemPriority.NotRemovable, SlidingExpiration=TimeSpan.FromMinutes(30) });
Pros:
A diferencia de la caché de ASP.NET, puede crear una instancia de objeto MemoryCache.
Se han realizado algunas mejoras leves en comparación con la interfaz de la caché de ASP.NET, como la capacidad de suscribirse a eventos de eliminación sin estar necesariamente allí cuando se agregaron los elementos, se eliminó el Insert () redundante, los elementos se pueden agregar con un CacheItem objeto con un inicializador que define la estrategia de almacenamiento en caché, y se agregó Contains ().
Contras:
Bricolaje: construye uno tú mismo
En realidad, es bastante simple crear un diccionario de almacenamiento en caché que realice una expiración explícita o deslizante. (Se vuelve mucho más difícil si desea que los elementos se eliminen automáticamente con el fin de borrar la memoria). Esto es todo lo que tiene que hacer:
Microsoft tiene que admitir sus diseños originales porque su base de usuarios ha creado una dependencia de ellos, pero eso no significa que sean buenos diseños.
Pros:
IDictionary<K,T>
. Esto hace que sea mucho más fácil de consumir ya que su interfaz es más predecible como interfaz de diccionario, además de que la hace más accesible para los ayudantes y métodos de extensión que funcionan con IDictionary <>.Contras:
Entre estas cuatro opciones, esta es mi preferencia. He implementado esta solución básica de almacenamiento en caché. Hasta ahora, parece funcionar perfectamente, no hay errores conocidos (¡contácteme con los comentarios a continuación o en jon-at-jondavis si los hay!), Y tengo la intención de usarlo en todos mis proyectos secundarios más pequeños que necesitan almacenamiento en caché básico. Aquí está:
Enlace de Github: https://github.com/kroimon/ExpirableItemDictionary
Enlace antiguo: ExpirableItemDictionary.zip
Digno de mención: AppFabric, NoSQL, Et Al
Tenga en cuenta que el título de este artículo de blog indica "Almacenamiento en caché simple", no "Almacenamiento en caché de alta resistencia". Si desea dedicarse a las tareas pesadas, debe buscar soluciones dedicadas y escalables.
fuente
MemoryCache es lo que dice que es, un caché almacenado en la memoria
HttpRuntime.Cache (consulte http://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache(v=vs.100).aspx y http://msdn.microsoft.com/en- us / library / system.web.caching.cache.aspx ) persiste en lo que sea que lo configure en su aplicación.
consulte, por ejemplo, "ASP.NET 4.0: escritura de proveedores de caché de salida personalizados" http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache -providers.aspx
fuente
MemoryCache.Default también puede servir como un "puente" si está migrando una aplicación clásica ASP.NET MVC a ASP.NET Core, porque no hay "System.Web.Caching" ni "HttpRuntime" en Core.
También escribí un pequeño punto de referencia para almacenar un
bool
elemento 20000 veces (y otro punto de referencia para recuperarlo) y MemoryCache parece ser dos veces más lento (27ms vs 13ms - eso es total para las 20k iteraciones) pero ambos son súper rápidos y esto probablemente pueda ser ignorado.fuente