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

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

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

public ActionResult AdvancedSearch(SearchBag searchBag)

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

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

Вы пробовали использовать VaryByParam = "searchBag.property"?

Eduardo Campañó 22.12.2008 14:14

нет, не видел. Постараюсь, что вы скажете. А как насчет перечисления нескольких параметров?

Boris Callens 22.12.2008 16:34

VaryByParam = "firstParam; secondParam; thirdParam"

Arnis Lapsa 10.11.2009 15:15

Немного поздно, но блок приложения кэширования корпоративной библиотеки включен в .Net 4.0, поэтому теперь вы можете использовать MemoryCache System.Runtime.Caching для аналогичного эффекта. Тоже где угодно :)

Carl 18.01.2012 21:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
82
4
54 307
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

Думаю, мне стоит почитать об Enterprise Library. Поскольку большая часть задержки происходит на уровне данных, я думаю, что в конечном итоге это будет лучшим решением. В настоящее время это БД, доступная только для чтения, поэтому проблема устаревшего объекта решается :)

Boris Callens 23.12.2008 12:10

Блок приложения для кеширования кажется излишним. Я обнаружил, что почти в каждом случае HttpRuntime.Cache более чем адекватен.

Jeff Putz 01.06.2009 22:43

Зачем переборщить? Сейчас я намного дальше в разработке, и я обнаружил, что система кеширования EL действительно проста в использовании. Ссылка на правильную библиотеку, добавление правильных строк конфигурации, и вы можете начать кэширование и получение объектов с одной строкой кода для каждого.

Boris Callens 29.10.2009 15:41

Я думаю, что некоторых людей раздражает шаг «добавить правильные строки конфигурации».

Mike Chamberlain 19.09.2012 11:33

Было бы хорошо, если бы вы также могли объяснить, как сделать недействительным кеш памяти, когда в базе данных есть обновления, часто ли вы используете службу для проверки, а затем как очистить кеш?

Shaiju T 19.03.2016 20:44

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

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

Michael K. Campbell 26.06.2014 02:41

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

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

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

[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")]

Другие вопросы по теме