Almacenamiento en caché en asp.net-mvc

Me gustaría almacenar en caché la mayoría de las acciones pesadas de la base de datos en mi sitio asp.net-mvc. En mi investigación he encontrado

  • donut caching en el blog de Phil
  • Almacenamiento en caché / compresión de filtros en el blog de Kazi
  • El podcast de Scott Hansleman sobre cómo almacenaron las cosas en SO.

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

public ActionResult AdvancedSearch(SearchBag searchBag) 

Donde searchBag es un objeto que contiene (un grupo) de parámetros de búsqueda opcionales. Mis propios puntos de vista son livianos (como deberían), pero el acceso a los datos puede consumir bastante tiempo, dependiendo de qué campos se llenen en la bolsa de búsqueda.

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

También me gusta almacenar en caché el modelo o la capa de datos. Esto aísla todo lo relacionado con la recuperación de datos del controlador / presentación. Puede acceder a la memoria caché de ASP.NET desde System.Web.HttpContext.Current.Cache o usar el bloque de aplicación de almacenamiento en caché de Enterprise Library. 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.

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

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

En este caso, parece que el almacenamiento en caché de 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 controla qué salida se almacena en caché es simple.

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

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