Almacenamiento en caché en asp.net-mvc

82

Me gustaría almacenar en caché mis acciones más pesadas de base de datos en mi sitio asp.net-mvc. En mi investigación he encontrado

Pero no siento que lo entienda todavía.
Quiero poder almacenar en caché mi solicitud POST dependiendo de varios análisis. Estos pares están en un objeto. Entonces me gustaría almacenar en caché el resultado de la siguiente solicitud:

public ActionResult AdvancedSearch(SearchBag searchBag)

Donde searchBag es un objeto que contiene (un montón) de parámetros de búsqueda opcionales. Mis vistas son ligeras (como deberían ser), pero el acceso a los datos puede llevar bastante tiempo, dependiendo de los campos que se llenen en la bolsa de búsqueda.

Tengo la sensación de que debería almacenar en caché en mi capa de datos, en lugar de en mis acciones.
¿Cómo se supone que debo usar VaryByParam en el atributo OutputCache?

Boris Callens
fuente
2
¿Ha probado con VaryByParam = "searchBag.property"?
Eduardo Campañó
no, no lo he hecho. Intentaré lo que dices. Pero, ¿qué tal enumerar varios parámetros?
Boris Callens
2
VaryByParam = "firstParam; secondParam; thirdParam"
Arnis Lapsa
1
Un poco más tarde, pero el Enterprise Library Caché Application Block está incluido en .Net 4.0, por lo que ahora se puede utilizar System.Runtime.Caching MemoryCache 's para lograr un efecto similar. En cualquier lugar también :)
Carl

Respuestas:

74

También me gusta almacenar en caché en el modelo o la capa de datos. Esto aísla todo lo que tiene que ver con la recuperación de datos del controlador / presentación. Puede acceder a la caché de ASP.NET desde System.Web.HttpContext.Current.Cacheo utilizar el Bloque de aplicaciones de almacenamiento en caché de la Biblioteca empresarial. Cree su clave para los datos almacenados en caché a partir de los parámetros de la consulta. Asegúrese de invalidar la caché cuando actualice los datos.

Mateo
fuente
1
Creo que debería leer sobre la biblioteca empresarial. Dado que la mayor parte del retraso se encuentra en la capa de datos, supongo que al final será la mejor solución. Actualmente es una base de datos de solo lectura, por lo que esto elimina el problema del objeto obsoleto :)
Boris Callens
17
El bloqueo de la aplicación de almacenamiento en caché parece un desastre. Descubrí que en casi todos los casos HttpRuntime.Cache es más que adecuado.
Jeff Putz
3
¿Por qué exagerar? Ahora estoy mucho más en el desarrollo y he encontrado que el sistema de caché de EL es realmente fácil de usar. Haga referencia a la biblioteca correcta, agregue las líneas de configuración correctas y puede comenzar a almacenar en caché y recuperar objetos con una línea de código cada uno.
Boris Callens
6
Creo que es el paso de "agregar las líneas de configuración correctas" lo que molesta a algunas personas.
Mike Chamberlain
Sería bueno si también pudiera explicar cómo invalidar la memoria caché cuando hay una actualización en la base de datos, ¿utiliza un servicio para verificar con frecuencia y luego cómo borra la memoria caché?
shaijut
66

O puede ser independiente de HttpContext.Current y acceder a Cache desde HttpRuntime.Cache :)

Andrei Rînea
fuente
Lo que también significa que aún podrá acceder a la 'caché' cuando el código se esté ejecutando en un hilo en segundo plano (es decir, async / await bondad).
Michael K. Campbell
12

A menudo, OutputCaching puede ser el más rápido y eficiente, pero solo cuando cumple con sus requisitos. ¡No tiene sentido tener rápido y eficiente si está mal! ;)

En este caso, parece que el almacenamiento en caché en la capa de datos es correcto porque tiene necesidades complejas de almacenamiento en caché. A veces, puede combinar los dos si el conjunto de parámetros que controlan qué salida se almacena en caché es simple.

Pirateado
fuente
0

puede usar el almacenamiento en caché de salida algo como esto

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

o puede usar perfiles de caché configurarlo en la configuración web

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
Nikki
fuente