Cache em asp.net-mvc

Eu gostaria de armazenar em cache minhas ações mais pesadas do database no meu site asp.net-mvc. Na minha pesquisa eu encontrei

  • donut caching no blog de Phil
  • Cache / compression de filtros no blog de Kazi
  • Podcast de Scott Hansleman sobre como eles colocavam as coisas em SO.

Mas eu não sinto que entendi ainda.
Quero poder armazenar minha solicitação POST em cache, dependendo de várias partes. Essas partes estão em um object. Então, gostaria de armazenar em cache o resultado da seguinte solicitação:

public ActionResult AdvancedSearch(SearchBag searchBag) 

Onde searchBag é um object que contém (um monte) de parâmetros de pesquisa opcionais. Minhas visões são leves (como deveriam ser), mas o access a dados pode consumir bastante tempo, dependendo de quais campos foram preenchidos na pasta de pesquisa.

Tenho a sensação de que deveria estar fazendo cache do meu datalayer, e não das minhas ações.
Como devo usar o VaryByParam no atributo OutputCache?

Eu gosto de armazenar em cache no modelo ou camada de dados também. Isso isola tudo a ver com a recuperação de dados do controlador / apresentação. Você pode acessar o cache do ASP.NET em System.Web.HttpContext.Current.Cache ou usar o Caching Application Block na Enterprise Library. Crie sua chave para os dados armazenados em cache a partir dos parâmetros da consulta. Certifique-se de invalidar o cache quando atualizar os dados.

Ou você pode ser independente do HttpContext.Current e acessar o cache de HttpRuntime.Cache 🙂

Muitas vezes, o OutputCaching pode ser o mais rápido e eficiente, mas apenas quando atende aos seus requisitos. Não adianta ter eficiência rápida se estiver errado! 😉

Nesse caso, parece que o armazenamento em cache na camada de dados está correto porque você tem necessidades complexas de armazenamento em cache. Às vezes, você pode combinar os dois se o conjunto de parâmetros que controlam a saída em cache for simples.

você pode usar o cache de saída algo parecido com isto

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

ou você pode usar perfis de cache configurados em configuração da web

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