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

82

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

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

public ActionResult AdvancedSearch(SearchBag searchBag)

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

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

Борис Калленс
источник
2
Вы пробовали использовать VaryByParam = "searchBag.property"?
Эдуардо Кампаньо,
нет, не видел. Постараюсь, что вы скажете. А как насчет перечисления нескольких параметров?
Борис Калленс,
2
VaryByParam = "firstParam; secondParam; thirdParam"
Арнис Лапса
1
Немного поздно, но блок приложения кэширования корпоративной библиотеки включен в .Net 4.0, так что теперь вы можете использовать MemoryCache System.Runtime.Caching для аналогичного эффекта. Куда угодно тоже :)
Карл

Ответы:

74

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

Мэтью
источник
1
Думаю, мне стоит почитать об Enterprise Library. Поскольку большая часть задержек приходится на уровень данных, я думаю, что в конечном итоге это будет лучшим решением. В настоящее время это БД только для чтения, поэтому проблема устаревшего объекта решается :)
Борис Калленс,
17
Блок приложения для кеширования кажется излишним. Я обнаружил, что почти в каждом случае HttpRuntime.Cache более чем адекватен.
Джефф Путц,
3
Зачем переборщить? Сейчас я намного дальше в разработке, и я обнаружил, что кеш-система EL действительно проста в использовании. Ссылайтесь на правильную библиотеку, добавьте правильные строки конфигурации, и вы можете начать кэширование и получение объектов с помощью одной строки кода для каждого.
Борис Калленс,
6
Я думаю, что некоторых людей раздражает шаг «добавить правильные строки конфигурации».
Майк Чемберлен
Было бы хорошо, если бы вы также могли объяснить, как сделать недействительным кеш памяти, когда в базе данных есть обновления, часто ли вы используете службу для проверки, а затем как очистить кеш?
Shaiju T
66

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

Андрей Рыня
источник
Это также означает, что вы по-прежнему сможете получить доступ к «кешу», когда код выполняется в фоновом потоке (то есть, async / await goodness).
Майкл К. Кэмпбелл
12

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

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

Haacked
источник
0

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

[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")]
Никки
источник