Chciałbym buforować moje najbardziej ciężkie akcje bazy danych w mojej witrynie asp.net-mvc. W moich badaniach znalazłem
- buforowanie pączków na blogu Phila
- Buforowanie / kompresja filtrów na blogu Kazi
- Podcast Scotta Hanslemana o tym, jak buforowali rzeczy w SO.
Ale czuję, że jeszcze tego nie rozumiem.
Chcę mieć możliwość buforowania mojego żądania POST w zależności od kilku pars. Te pars znajdują się w obiekcie. Chciałbym więc zapisać w pamięci podręcznej wynik następującego żądania:
public ActionResult AdvancedSearch(SearchBag searchBag)
Gdzie searchBag jest obiektem, który przechowuje (kilka) opcjonalnych parametrów wyszukiwania. Moje poglądy same w sobie są lekkie (jak powinny), ale dostęp do danych może być dość czasochłonny, w zależności od tego, jakie pola są wypełnione w worku wyszukiwania.
Mam wrażenie, że powinienem buforować dane w mojej warstwie danych, a nie na moich działaniach.
Jak mam używać VaryByParam w atrybucie OutputCache?
źródło
Odpowiedzi:
Lubię też buforować w modelu lub warstwie danych. To izoluje wszystko, co ma związek z pobieraniem danych ze sterownika / prezentacji. Dostęp do pamięci podręcznej ASP.NET można uzyskać z
System.Web.HttpContext.Current.Cache
lub użyć bloku aplikacji buforowania z biblioteki przedsiębiorstwa. Utwórz klucz dla danych w pamięci podręcznej na podstawie parametrów zapytania. Pamiętaj, aby unieważnić pamięć podręczną podczas aktualizacji danych.źródło
Lub możesz być niezależny od HttpContext.Current i uzyskiwać dostęp do Cache z HttpRuntime.Cache :)
źródło
Często OutputCaching może być najszybsze i najbardziej wydajne, ale tylko wtedy, gdy spełnia Twoje wymagania. Nie ma sensu mieć szybkiej wydajności, jeśli jest źle! ;)
W tym przypadku wygląda na to, że buforowanie w warstwie danych jest poprawne, ponieważ masz złożone potrzeby dotyczące buforowania. Czasami można połączyć te dwa elementy, jeśli zestaw parametrów kontrolujących buforowanie danych wyjściowych jest prosty.
źródło
możesz użyć buforowania wyjścia, czegoś takiego
[OutputCache(Duration = 10, VaryByParam = "empID")] public ActionResult GetEmployeeDetail(int empID) { Employee e = new Employee(); return Content(e.getEmployeeDetails(empID)); }
lub możesz użyć profili pamięci podręcznej ustawionych w konfiguracji internetowej
<caching> <outputCacheSettings> <outputCacheProfiles> <add name="Admin" duration="86420" varyByParam="none"/> </outputCacheProfiles> </outputCacheSettings> </caching> and use this tag [OutputCache(CacheProfile="Admin")]
źródło