Я хотел бы кэшировать свои самые тяжелые действия с базой данных на моем сайте asp.net-mvc. В своем исследовании я обнаружил
- кеширование пончиков в блоге Фила
- Кеширование / сжатие фильтров в блоге Кази
- Подкаст Скотта Ханслемана о том, как они кешируют вещи в SO.
Но я еще не чувствую, что понимаю.
Я хочу иметь возможность кэшировать свой запрос POST в зависимости от нескольких частей. Эти части находятся в объекте. Поэтому я хотел бы кешировать результат следующего запроса:
public ActionResult AdvancedSearch(SearchBag searchBag)
Где searchBag - это объект, содержащий (набор) необязательных параметров поиска. Сами мои представления невелики (как и должно быть), но доступ к данным может занять довольно много времени, в зависимости от того, какие поля заполнены в сумке поиска.
У меня такое чувство, что я должен кэшировать свой уровень данных, а не свои действия.
Как я должен использовать VaryByParam в атрибуте OutputCache?
asp.net-mvc
caching
Борис Калленс
источник
источник
Ответы:
Мне также нравится кэшировать в модели или на уровне данных. Это изолирует все, что связано с извлечением данных из контроллера / презентации. Вы можете получить доступ к кешу ASP.NET из
System.Web.HttpContext.Current.Cache
или использовать блок кэширования приложения из корпоративной библиотеки. Создайте свой ключ для кэшированных данных из параметров запроса. Не забудьте сделать кеш недействительным при обновлении данных.источник
Или вы можете быть независимыми от HttpContext.Current и получить доступ к кешу из HttpRuntime.Cache :)
источник
Часто 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")]
источник