He leído mucha información sobre el almacenamiento en caché de páginas y el almacenamiento en caché parcial de páginas en una aplicación MVC. Sin embargo, me gustaría saber cómo almacenaría en caché los datos.
En mi escenario, usaré LINQ to Entities (entidad framework). En la primera llamada a GetNames (o cualquiera que sea el método), quiero obtener los datos de la base de datos. Quiero guardar los resultados en caché y en la segunda llamada para usar la versión en caché si existe.
¿Alguien puede mostrar un ejemplo de cómo funcionaría esto, dónde debería implementarse (modelo?) Y si funcionaría.
He visto esto hecho en aplicaciones ASP.NET tradicionales, típicamente para datos muy estáticos.
asp.net-mvc
database
caching
Coolcoder
fuente
fuente
Respuestas:
Consulte el archivo System.Web dll en su modelo y use System.Web.Caching.Cache
Un poco simplificado pero supongo que funcionaría. Esto no es específico de MVC y siempre he usado este método para almacenar datos en caché.
fuente
DB.GetNames().AsQueryable
método de retrasar la consulta?Aquí hay una clase / servicio de ayuda de caché simple y agradable que uso:
Uso:
El proveedor de caché verificará si hay algo con el nombre de "ID de caché" en el caché, y si no lo hay, llamará a un método delegado para obtener datos y almacenarlos en caché.
Ejemplo:
fuente
Me refiero a la publicación de TT y sugiero el siguiente enfoque:
Consulte el archivo System.Web dll en su modelo y use System.Web.Caching.Cache
No debe devolver un valor de relectura del caché, ya que nunca sabrá si en ese momento específico todavía está en el caché. Incluso si lo insertó en la declaración anterior, es posible que ya haya desaparecido o que nunca se haya agregado al caché, simplemente no lo sabe.
Entonces agrega los datos leídos de la base de datos y los devuelve directamente, no releyendo de la caché.
fuente
Cache["names"] = noms;
en el caché?Para .NET 4.5+ framework
añadir referencia:
System.Runtime.Caching
agregar usando la declaración:
using System.Runtime.Caching;
Más información:
https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx
https://docs.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications
fuente
Db.GerNames()
vieneSteve Smith hizo dos excelentes publicaciones en el blog que demuestran cómo usar su patrón CachedRepository en ASP.NET MVC. Utiliza el patrón de repositorio de manera efectiva y le permite obtener el almacenamiento en caché sin tener que cambiar su código existente.
http://ardalis.com/Introducing-the-CachedRepository-Pattern
http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
En estas dos publicaciones, muestra cómo configurar este patrón y también explica por qué es útil. Al usar este patrón, obtiene el almacenamiento en caché sin que su código existente vea ninguna de las lógicas de almacenamiento en caché. Esencialmente, utiliza el repositorio en caché como si fuera cualquier otro repositorio.
fuente
AppFabric Caching se distribuye y es una técnica de almacenamiento en caché en memoria que almacena datos en pares clave-valor utilizando memoria física en varios servidores. AppFabric proporciona mejoras de rendimiento y escalabilidad para aplicaciones .NET Framework. Conceptos y arquitectura
fuente
Ampliando la respuesta de @Hrvoje Hudo ...
Código:
Ejemplos
Almacenamiento en caché de un solo elemento (cuando cada elemento se almacena en caché en función de su ID porque el almacenamiento en caché de todo el catálogo para el tipo de artículo sería demasiado intenso).
Guardar en caché todo
Por qué TId
El segundo ayudante es especialmente bueno porque la mayoría de las claves de datos no son compuestas. Se podrían agregar métodos adicionales si utiliza claves compuestas a menudo. De esta forma, evita hacer todo tipo de concatenación de cadenas o cadenas. Formatos para que la clave pase al ayudante de caché. También facilita la transferencia del método de acceso a datos porque no tiene que pasar la ID al método de envoltura ... todo se vuelve muy conciso y consistente para la mayoría de los casos de uso.
fuente
Aquí hay una mejora en la respuesta de Hrvoje Hudo. Esta implementación tiene un par de mejoras clave:
Tenga en cuenta que esto depende de Newtonsoft.Json para serializar el objeto dependOn, pero que puede cambiarse fácilmente por cualquier otro método de serialización.
ICache.cs
InMemoryCache.cs
Uso:
fuente
if (item == null)
debe estar dentro de la cerradura. Ahora, cuando estoif
está antes del bloqueo, puede ocurrir una condición de carrera. O incluso mejor, debe mantenerloif
antes del bloqueo, pero vuelva a verificar si el caché aún está vacío como la primera línea dentro del bloqueo. Porque si dos hilos llegan al mismo tiempo, ambos actualizan el caché. Su bloqueo actual no es útil.fuente
Lo he usado de esta manera y funciona para mí. https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx información de parámetros para system.web.caching.cache.add.
fuente
Yo uso dos clases. Primero, el objeto central de caché:
El segundo es la lista de objetos de caché:
fuente
Diré que implementar Singleton en este problema persistente de datos puede ser una solución para este asunto en caso de que encuentre soluciones anteriores mucho más complicadas
fuente
fuente
También puede probar y usar el almacenamiento en caché integrado en ASP MVC:
Agregue el siguiente atributo al método de controlador que desea almacenar en caché:
En este caso, el ActionResult de esto se almacenará en caché durante 10 segundos.
Más sobre esto aquí
fuente