Co to jest cache i jak elastycznie nim zarządzać? Do czego służy Spring Cache i co oferuje? W tym artykule znajdziesz kluczowe informacje na temat tych zagadnień, a także dowiesz się, jak efektywnie wykorzystać możliwości, jakie daje framework Spring do cache’owania danych, oraz poznasz pokrótce sposoby jego konfiguracji. Sprawdź!
Co to jest cache? Najważniejsze informacje
Zanim przejdziemy do odpowiedzi na pytanie, co to jest Spring Cache i jakie możliwości daje, warto skupić się najpierw na samym zagadnieniu cache’a.
Cache oznacza – tłumacząc z języka angielskiego – pamięć podręczną, która umożliwia przechowywanie w pamięci danych, które zostały już wcześniej użyte. Celem tego mechanizmu jest przede wszystkim ułatwienie i przyspieszenie ponownego dostępu do żądanych informacji, które mogą być potrzebne danemu użytkownikowi powtórnie w niedalekiej przyszłości.
Jest to jednoznaczne z ograniczeniem liczby zapytań do baz danych, a także liczby wywołań zewnętrznych pochodzących z serwisów poszczególnych użytkowników. Optymalizacja w tym zakresie ma zatem bezpośrednie przełożenie również na szybkość działania całej aplikacji czy strony. Pamięć podręczną, czyli cache wykorzystuje się bowiem niemal we wszystkich systemach, a więc w procesorach i pamięci RAM, jak i w różnego rodzaju aplikacjach (webowych, mobilnych itp.).
Projektując produkt cyfrowy taki jak aplikacja, można wykorzystać wiele cache’y, które skoncentrowane są przede wszystkim na wspomnianej optymalizacji liczby zapytań, co ma również wpływ na przyspieszenie działania całej aplikacji. Warto w tym kontekście zwrócić szczególną uwagę na możliwości użycia cache’a, które przynosi Spring Cache.
Spring Cache – co to jest i do czego służy?
Spring Cache udostępnia API umożliwiające korzystanie z cache’a. Dzięki temu można w elastyczny sposób konfigurować cache’a z wykorzystaniem odpowiednich zależności oraz adnotacji. Natomiast dodając konkretne konfiguracje, można ponadto korzystać z zewnętrznego providera. Spring Cache to zatem użyteczne narzędzie do zwiększania wydajności oraz dostępności serwera. Jego zaletą jest również fakt, że sama konfiguracja, jak i późniejsze korzystanie są stosunkowo proste i intuicyjne w obsłudze.
W Spring Cache istnieje możliwość korzystania z jednego CacheManagera, czyli specjalnego interfejsu do zarządzania cache’em, jak i wykorzystywania kilku jednocześnie. Biblioteka ta pozwala również na dodanie konfiguracji czasu życia cache’a czy przechowywania danych.
Można wskazać dwa rodzaje ContentManagera w obrębie Spring Cache:
- bazujące na wewnętrznych mechanizmach Springa (np. SimpleCacheManager);
- umożliwiające konfigurację zewnętrznych providerów (np. RedisCacheManager).
Konfiguracja Spring Cache – podstawowe informacje
Konfiguracja Spring Cache bazuje na adnotacjach, co w praktyce okazuje się łatwiejsze i bardziej intuicyjne niż tradycyjne konfigurowanie w pliku XML. Adnotacja odpowiedzialna za uruchomienie mechanizmu zarządzającego procesami cachowania, którą należy wykorzystać w pierwszej kolejności, to @EnableCaching. Jej dodanie umożliwia przejście do cache’owania danych. Jeśli kilka serwisów wykorzystuje te same metody, wówczas cache jest dodawany z poziomu warstwy dostępu do danych. W pozostałych przypadkach cały proces odbywa się zwykle w warstwie serwisów aplikacyjnych.
Na początku należy zacząć od adnotacji @Cacheable, która jest wykorzystywana na metodach o zmiennych parametrach, które pobierają dane, bez ich modyfikowania. Istotnym parametrem jest cacheName, za pomocą którego można nadać nazwę cache’a, co może przydać się w trakcie konfiguracji zewnętrznego providera. Kolejny parametr to key – klucz dodawany do cache’a, którego domyślnym generatorem jest SimpleKeyGenerator. W roli klucza można zastosować także własną metodę zdefiniowaną wewnątrz klasy (np. hashCode()). Rekomendowaną praktyką w przypadku Spring Cache jest definiowanie klucza lub też dołączenie własnego keyGeneratora.
Spring Cache – jak działa?
Mechanizm Spring Cache funkcjonuje w oparciu o aspekty (ang. Aspect Oriented Programming). Dedykowany aspekt odpowiedzialny za tworzenie cache’a reaguje na adnotację – @Cacheable na danej metodzie – i następnie tworzy dla niej cache. Za cały proces odpowiada klasa CacheInterceptor, która – mówiąc najprościej – wywołuje pożądane metody nadklas w określonej kolejności.
W Spring Cache domyślnym cache managerem jest ConcurrentCacheManager, który jest odpowiedzialny za zapisywanie cache w ConcurrentHashMap. Finalnie dla każdego cache’a stosowana jest klasa ConcurrentMapCache. Ona również zapisuje dane w ConcurrentHashMap, natomiast poszczególne wpisy dla cache’a zapisywane są w polu store.
Warto jednak wiedzieć, że domyślny cache manager nie pozwala na pełne zarządzanie cache’em – przede wszystkim nie można za jego pomocą wyczyścić cache’a po upływie określonego czasu ani ustalić pożądanego limitu danych (wszystkie tego rodzaju operacje trzeba zatem wykonywać ręcznie). Pomocnym rozwiązaniem w tym aspekcie okazuje się właśnie Spring Cache i jego dodatkowe adnotacje, np. @CachePut, która sprawia, że w momencie wywoływania danej metody, aktualizowany jest wpis w cache’u. Warto wspomnieć także o adnotacji @CacheEvict odpowiedzialnej za czyszczenie cache’a, którą dodaje się na metodach usuwających dane. Dzięki temu można z sukcesem zaoszczędzić cenne miejsce w pamięci cache’a, zachowując spójność między głównym źródłem danych a cache’em.
Używanie cache’a ma duże znaczenie w kontekście szybkości i wydajności aplikacji, a on sam stanowi istotną część systemu. Skonfigurowanie dodatkowo Spring Cache to natomiast sposób na jeszcze większe usprawnienie działania rozwiązania cyfrowego.