Кешування в 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, я думаю. Оскільки більша частина затримки лежить на рівні даних, я думаю, це буде найкращим рішенням у підсумку. На даний момент це БД лише для читання, тому це усуває проблему застарілого об'єкта :)
Борис Калленс,

17
Блок кешування додатків здається цілим безладом. Я виявив, що майже у кожному випадку HttpRuntime.Cache є більш ніж достатнім.
Джефф Пуц,

3
Чому надмірно? Зараз я набагато далі в розробці, і я виявив, що кеш-система EL дійсно проста у використанні. Зверніться до правильної бібліотеки, додайте правильні конфігураційні рядки, і ви зможете розпочати кешування та отримання об’єктів з одним рядком коду в кожному.
Борис Калленс,

6
Я думаю, це крок "додати правильні конфігураційні рядки", який дратує деяких людей.
Mike Chamberlain

було б добре, якби ви також могли пояснити, як зробити недійсною кеш-пам'ять, коли в базі даних є оновлення, чи використовуєте ви службу для частої перевірки, а потім як очищаєте кеш?
Shaiju T

66

Або ви можете бути незалежним від HttpContext.Current і отримати доступ до кешу з HttpRuntime.Cache :)


Це також означає, що ви все одно зможете отримати доступ до "кешу", коли код запускається у фоновому потоці (тобто, async / await goodness).
Michael K. Campbell

12

Часто OutputCaching може бути найбільш швидким та ефективним, але лише тоді, коли він відповідає вашим вимогам. Немає сенсу швидко працювати, якщо це неправильно! ;)

У цьому випадку це схоже на те, що кешування на рівні даних є правильним, оскільки у вас є складні потреби в кешуванні. Іноді ви можете поєднати обидва ці варіанти, якщо набір параметрів, що керують кешованим результатом, простий.


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")]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.