Кэширование в asp.net-mvc

Я хотел бы кэшировать самые тяжелые действия с базой данных на моем сайте asp.net-mvc. В моем исследовании я нашел

Но я не чувствую, что я все еще получаю. Я хочу, чтобы иметь возможность кэшировать мой запрос POST в зависимости от нескольких парсов. Эти парсы находятся в объекте. Поэтому я хотел бы кэшировать результат следующего запроса:

public ActionResult AdvancedSearch(SearchBag searchBag)

Где searchBag - объект, который содержит (кучу) дополнительных параметров поиска. Мои представления сами по себе являются легкими (как и должно быть), но доступ к данным может занять довольно много времени, в зависимости от того, какие поля заполнены в поисковом мешке.

У меня такое чувство, что я должен кэшировать на своем datalayer, а не на моих действиях.
Как я должен использовать VaryByParam в атрибуте OutputCache?

Ответ 1

Мне нравится кэшировать в модели или на уровне данных. Это изолирует все, что необходимо для получения данных от контроллера/презентации. Вы можете получить доступ к кешу ASP.NET с System.Web.HttpContext.Current.Cache или использовать блок приложений кэширования из корпоративной библиотеки. Создайте свой ключ для кэшированных данных из параметров запроса. Обязательно отмените кеширование при обновлении данных.

Ответ 2

Или вы можете быть независимы от HttpContext.Current и кэш доступа из HttpRuntime.Cache:)

Ответ 3

Часто OutputCaching может быть самым быстрым и эффективным, но только тогда, когда он соответствует вашим требованиям. Нет смысла быстро работать, если это неправильно!;)

В этом случае это похоже на то, что кеширование на слое данных является правильным, потому что у вас сложное кэширование. Иногда вы можете комбинировать эти два, если набор параметров, которые контролируют кеширование вывода, прост.

Ответ 4

вы можете использовать кэширование вывода что-то вроде этого

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

или вы можете использовать профили кэша, установленные в веб-конфигурации

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

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

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