Buforowanie w asp.net-mvc

82

Chciałbym buforować moje najbardziej ciężkie akcje bazy danych w mojej witrynie asp.net-mvc. W moich badaniach znalazłem

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?

Boris Callens
źródło
2
Czy próbowałeś z VaryByParam = "searchBag.property"?
Eduardo Campañó,
nie, nie mam. Spróbuję, co powiesz. Ale co powiesz na wyliczenie kilku parametrów?
Boris Callens
2
VaryByParam = "firstParam; secondParam; thirdParam"
Arnis Lapsa
1
Trochę późno, ale blok aplikacji buforowania bibliotek korporacyjnych jest zawarty w .Net 4.0, więc teraz możesz używać pamięci podręcznej MemoryCache System.Runtime.Caching dla podobnego efektu. Wszędzie też :)
Carl

Odpowiedzi:

74

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.Cachelub 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.

Mateusz
źródło
1
Myślę, że powinienem poczytać o Enterprise Library. Ponieważ większość opóźnienia leży w warstwie danych, myślę, że ostatecznie będzie to najlepsze rozwiązanie. Obecnie jest to baza danych tylko do odczytu, więc rozwiązuje to problem z nieaktualnymi obiektami :)
Boris Callens,
17
Blok aplikacji do buforowania wydaje się być całym bałaganem. Zauważyłem, że prawie w każdym przypadku HttpRuntime.Cache jest więcej niż wystarczający.
Jeff Putz
3
Dlaczego przesada? Jestem teraz daleko w rozwoju i stwierdziłem, że system pamięci podręcznej EL jest naprawdę łatwy w użyciu. Odwołaj się do odpowiedniej biblioteki, dodaj poprawne wiersze konfiguracji i możesz rozpocząć buforowanie i pobieranie obiektów z jednym wierszem kodu.
Boris Callens
6
Myślę, że to krok „dodaj prawidłowe linie konfiguracyjne”, który irytuje niektórych ludzi.
Mike Chamberlain
byłoby dobrze, gdybyś mógł również wyjaśnić, jak unieważnić pamięć podręczną, gdy w bazie danych jest aktualizacja, czy często korzystasz z usługi, aby sprawdzić, a następnie jak wyczyścić pamięć podręczną?
Shaiju T
66

Lub możesz być niezależny od HttpContext.Current i uzyskiwać dostęp do Cache z HttpRuntime.Cache :)

Andrei Rînea
źródło
Oznacza to również, że nadal będziesz mógł uzyskać dostęp do `` pamięci podręcznej '', gdy kod jest uruchamiany w wątku w tle (tj. Async / await goodness).
Michael K. Campbell
12

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.

Haacked
źródło
0

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")]
Nikki
źródło