Cache po stronie serwera - Server Side w ASP.NET MVC

Zapisywanie danych w pamięci operacyjnej serwera.


Cachowanie po stronie serwera ma na celu jak najszybsze zwrócenie danych do klienta, jak najmniejszym kosztem zużycia zasobów serwera (pamięci i procesora).

Cache po stronie serwera możemy podzielić na 3 podstawowe zakresy:

  • cache dla żądania HTTP - dane zapisujemy na czas żądania:
    HttpContext.Items["PierwszeZadanie"] = true;
    
  • cache dla użytkownika - dane zapisywane są w sesji i są dostępne tylko dla jednego użytkownika:
    HttpContext.Session["username"] = "Login";
    
  • cache dla aplikacji - dane dostępne dla całej aplikacji:
    Application["DataUruchomienia"] = System.DateTime.Now;
    
Poprzednie metody są to metody na najniższym poziomie i są rzadko stosowane. W ASP.NET istnieje bilbioteka System.Web.Cache ułatwiająca prace z cache. Pozwala ona na zarządzanie:
  • czasem żywotności - jak długo dane zapisane w cache będą aktualne np. 20 sekund,
  • zależnościami - pomiędzy danymi w cache a innymi elementami aplikacji np. plikami,
  • zarządzanie pamięcią - wykorzystywaną na cache (gdy brakuje pamięci część najrzadziej wykorzystywanych danych zostaje usunięta z cache).

Dostępne rodzaje zależności:

  • Aggregate - usuwa dany element z cache, gdy zajdą zmiany w powiązanych elementach,
  • Custom - usuwanie z cache zależne od własnej klasy,
  • File - usuwa powiązany element z cache, gdy zajdą zmiany w pliku lub plik zostanie skasowany,
  • Key - usuwa element z cache, gdy zostanie skasowany inny element z cache,
  • SQL - usuwa element z cache, gdy zostaną wprowadzone zmiany w określonej tabeli w bazie danych.

Output cache

Output cache to najczęściej stosowana technika cachowania opierająca się na zapisywaniu wyniku żądania, czyli najczęściej widoku (kodu HTML). W ASP.NET MVC cachowanie wyjściowe dostępne jest poprzez wspomniany przy okazji kontrolerów filtr akcji OutputCache. Aby użyć output cache dodajemy atrybut przed akcją w kontrolerze.
[OutputCache(Duration = 10, VaryByParam = "none")]
public ActionResult Index()
{
    return View();
}

Atrybut OutputCache posiada następujące parametry:

  • CacheProfile - wykorzystuje profil cachowania, czyli pewna ogólna zasada cachowania zdefiniowana w pliku web.config (pozwala zmienić zasadę cachowania wielu akcji dzięki zmianie jednej wartości w pliku konfiguracyjnym):
    [OutputCache(CacheProfile = "NazwaProfilu")]
    public ActionResult Index()
    {
        return View();
    }
    
    Tworzenie profilu w web.config:
    <caching>
    <outputCacheSettings>
        <outputCacheProfiles>
        <add name="NAzwaProfilu" duration="3600" varyByParam="id"/>
        </outputCacheProfiles>
    </outputCacheSettings>
    </caching>
    
  • Duration - czas przez jaki dane mają być cachowane:
    [OutputCache(Duration = 1)]
    public ActionResult Index()
    {
        return View();
    }
    
  • NoStore - brak cachowania (np. wyłączenie cachowania dla jednej akcji),
  • Location - określa gdzie dane mają być cachowane, dostępne są następujące opcje:
    • Client - po stornie klienta,
      [OutputCache(Location=OutputCacheLocation.Client)]
      public ActionResult Index()
      {
          return View();
      }
      
    • Any - automatycznie wybrana opcja,
    • Server - po stronie serwera,
    • Server and Client - po stronie serwera i klienta,
    • Downstream - gdzie indziej niż serwer aplikacji,
    • None - brak cachowania,
  • SqlDependency - cachowanie zależne od zmian w bazie danych,
  • VaryByContentEncoding - cachowanie zależne od kodowania,
  • VaryByParam - cachowanie zależne od parametru w akcji:
    [OutputCache(VaryByParam = "id")]
    public ActionResult Index(int id)
    {
        return View();
    }
    
  • VaryByCustom - cachowanie zależne od indywidualnej implementacji zależności,
  • VaryByHeader - cachowanie zależne od nagłówka HTTP.

Cachowanie częściowe

  • DonutCaching - zapisuje w cache tylko część strony, która się nie zmienia dla różnych użytkowników, np. cała strona bez części logowania (inne Imię lub Nazwisko dla każdego użytkownika powodowałoby tworzenie dla każdego osobnych danych w cache). W ASP.NET MVC należy zainstalować rozszerzenie MvcDonutCaching aby było możliwe korzystanie z tej formy cachowania.
  • DonutHoleCaching - zapisuje te części, które nie mogą być cachowane za pomocą DonutCaching tzw. dziury. Za pomocą tego cachowania może być zapisywana np. lista kategorii, która zostanie wczytana z cache natomiast reszta strony będzie wczytywana standardowo ładowana lub wczytana z innego cache. Ta forma cachowania jest dostępna przy pomocy atrybutu ChildActionOnly:
    [ChildActionOnly]
    public ActionResult Index()
    {
        return View();
    }
    

Cachowanie rozproszone

W dużych aplikacjach, gdy dane przechowywane są na więcej niż jednym serwerze niezbędne jest użycie innego bardziej wydajnego sposobu cachowania. Tworzy się osobną, wspólną warstwę przeznaczoną do cachowania, do której dostęp posiadają wszystkie serwery. Takie rozwiązanie zapewnia lepsza wydajność, skalowalność oraz redundantność (odporność na awarie pojedynczych serwerów). Do cachowania rozproszonego służy narzędzie Microsoft Velocity.
Komentarze facebook (polub nasz profil na FB aby je zobaczyć):