Kod

Redis do buforowania: jak przyspieszyć interakcje z bazą danych

Redis do buforowania: jak przyspieszyć interakcje z bazą danych

Bezpłatny kurs Pythona ➞ Mini kurs dla Początkujący i doświadczeni programiści. Cztery ciekawe projekty w portfolio, bezpośrednia komunikacja z prelegentem. Kliknij i zobacz, czego możesz się nauczyć na kursie.

Dowiedz się więcej

Dzisiaj opracujemy prostą aplikację, która będzie współpracować z bazą danych MySQL i zaimplementuje mechanizm buforowania za pomocą Redis. Wszystkie komponenty aplikacji, w tym baza danych, zostaną wdrożone w kontenerach Docker, co zapewni łatwe zarządzanie i skalowalność. Użycie Dockera pozwoli nam łatwo skonfigurować środowisko i odizolować zależności, a integracja z Redis pomoże poprawić wydajność aplikacji poprzez buforowanie często używanych danych.

Jeśli nie znasz jeszcze Redis, zalecamy rozpoczęcie od tego artykułu. Omówi on podstawowe koncepcje i zasady pracy z tym systemem zarządzania bazami danych. Aby uzyskać informacje na temat pracy z Dockerem, kliknij ten link. Redis to wydajny magazyn danych w pamięci, który zapewnia szybkie przetwarzanie zapytań i wysoką wydajność. Docker upraszcza proces wdrażania aplikacji, w tym Redis, w izolowanych kontenerach.

Jaką aplikację opracujemy?

Ta aplikacja Spring Boot została zaprojektowana do przechowywania książek w bazie danych i pełni funkcję księgarni internetowej. Umożliwi użytkownikom łatwe wyszukiwanie, przeglądanie i kupowanie książek za pośrednictwem przyjaznego interfejsu. Aplikacja będzie zawierać funkcje zarządzania katalogiem książek, dodawania nowych pozycji i przetwarzania zamówień. Dzięki Spring Boot aplikacja będzie charakteryzować się wysoką wydajnością i łatwością wdrożenia. Głównym celem projektu jest stworzenie efektywnej platformy dla miłośników książek i wymiany książek, gdzie każdy może znaleźć interesującą go literaturę i dokonać zakupu online.

Częste zapytania do bazy danych mogą znacznie spowolnić działanie aplikacji. Aby poprawić wydajność, korzystamy z buforowania — strategii, która pozwala na przechowywanie wyników zapytań w pamięci RAM. Dzięki temu, przy ponownym wykonywaniu tych samych zapytań, prędkość aplikacji znacznie wzrasta. Buforowanie nie tylko optymalizuje czas reakcji, ale także zmniejsza obciążenie bazy danych, zwiększając wydajność i responsywność aplikacji.

Jeśli dane są dostępne w pamięci podręcznej, korzystamy z nich z niej. W przeciwnym razie do pamięci trwałej kierowane jest żądanie wymagające większych zasobów. Takie podejście optymalizuje wydajność systemu i przyspiesza dostęp do informacji. Buforowanie danych znacznie zmniejsza obciążenie bazy danych i poprawia responsywność aplikacji.

Jeśli dopiero zaczynasz korzystać z Redis, zalecamy rozpoczęcie od tego artykułu. Zapewni on podstawową wiedzę na temat możliwości i korzyści płynących z korzystania z Redis. Aby dowiedzieć się, jak pracować z Dockerem, możesz zapoznać się z odpowiednimi materiałami. Redis to wydajny magazyn danych w pamięci, idealny do buforowania, kolejkowania i wielu innych zastosowań. Docker z kolei ułatwia wdrażanie i zarządzanie aplikacjami, w tym Redis, w kontenerach, zapewniając wygodę i elastyczność podczas tworzenia.

Przygotowanie

  • Spring Web,
  • Spring Data JPA,
  • Sterownik MySQL,
  • Spring Data Redis
  • i Lombok (opcjonalnie).

Pobierz i rozpakuj archiwum, a następnie otwórz je w środowisku programistycznym. Umożliwi to rozpoczęcie pracy z projektem i wprowadzenie niezbędnych zmian. Upewnij się, że wszystkie pliki znajdują się we właściwej lokalizacji, aby uniknąć problemów podczas uruchamiania aplikacji.

Tworzenie aplikacji

W otwartym projekcie należy utworzyć strukturę katalogów, która zapewni uporządkowane przechowywanie plików i uproszczone zarządzanie projektem. Aby to zrobić, postępuj zgodnie z sugerowaną strukturą katalogów, która pomoże Ci efektywnie wykorzystać zasoby i utrzymać porządek w kodzie. Ukończony kod jest dostępny do wglądu.

Rozpocznijmy proces rozwoju od utworzenia modelu, a konkretnie od zdefiniowania klasy Book, która reprezentuje encję przechowywaną w bazie danych. Klasa Book będzie zawierać kluczowe atrybuty, takie jak tytuł książki, autor, gatunek, data publikacji i inne ważne cechy. Odpowiednia struktura klas zapewni efektywne przechowywanie i zarządzanie danymi książek, co stanowi podstawę dalszego rozwoju funkcjonalności aplikacji. Ważne jest również rozważenie możliwości rozbudowy modelu w przyszłości, na przykład poprzez dodanie nowych pól lub metod do pracy z danymi. Dzięki temu nasz system będzie bardziej elastyczny i adaptowalny do zmieniających się wymagań użytkowników.

@Data to adnotacja z biblioteki Lombok, która automatycznie generuje kod szablonowy dla klas Java. Tworzy niezbędne konstruktory, gettery i settery, a także metody equals(), hashCode() i toString(). Użycie adnotacji @Data znacznie upraszcza proces pisania kodu i czyni go bardziej przejrzystym i czytelnym, uwalniając programistów od konieczności ręcznego pisania monotonnych metod. Adnotacja ta jest szczególnie przydatna w przypadku klas działających jako modele danych. Dzięki temu programiści mogą skupić się na logice biznesowej aplikacji, nie tracąc czasu na rutynowe zadania.

BookRepository to interfejs rozszerzający możliwości JpaRepository. Korzystanie z Spring Data JPA eliminuje konieczność samodzielnego wdrażania operacji CRUD, upraszczając rozwój i zwiększając wydajność pracy z bazami danych. Pozwala nam to skupić się na logice biznesowej aplikacji, minimalizując rutynowe zadania związane z przetwarzaniem danych.

Klasa usługi jest kluczowym elementem architektury aplikacji. Służy jako warstwa pośrednia między kontrolerem, który przetwarza żądania HTTP, a repozytorium, które odpowiada za interakcję z bazą danych. Każda metoda w klasie usługi jest adnotowana, co zapewnia wydajne buforowanie danych. To znacznie poprawia wydajność aplikacji poprzez zmniejszenie liczby zapytań do bazy danych i przyspieszenie przetwarzania danych dla użytkownika. Zastosowanie tego podejścia przyczynia się do bardziej ustrukturyzowanego i czytelnego kodu, ułatwiając jego utrzymanie i skalowanie.

Adnotacja @CacheConfig służy do konfigurowania wszystkich operacji buforowania w określonej klasie. Umożliwia ona scentralizowane zarządzanie parametrami buforowania, takimi jak nazwa bufora, strategia buforowania i inne ustawienia, co pomaga uprościć buforowanie w aplikacjach. Użycie adnotacji @CacheConfig pomaga zoptymalizować wydajność aplikacji poprzez zmniejszenie obciążenia bazy danych i skrócenie czasu reakcji systemu.

Adnotacja @Cacheable określa, że ​​wynik metody jest przechowywany w pamięci podręcznej. Kolejne wywołania metody pobierają wynik z pamięci podręcznej przy użyciu klucza określonego w parametrach. Optymalizuje to wydajność aplikacji, skraca czas reakcji i zmniejsza obciążenie bazy danych, ponieważ dane nie są żądane wielokrotnie. Użycie @Cacheable umożliwia efektywne zarządzanie pamięcią podręczną i poprawia ogólną wydajność systemu.

Adnotacja @CachePut służy do aktualizacji danych w pamięci podręcznej. Ta adnotowana metoda zapewnia aktualizację rekordu w pamięci podręcznej po jej wykonaniu, gwarantując, że informacje są zawsze aktualne. Użycie @CachePut pomaga zoptymalizować wydajność aplikacji poprzez minimalizację wywołań bazy danych i zmniejszenie obciążenia serwera. Efektywne użycie tej adnotacji przyczynia się do szybszego przetwarzania żądań i poprawy ogólnego komfortu użytkowania.

@CacheEvict to adnotacja używana w Spring Framework do usuwania rekordu z pamięci podręcznej. Ta adnotacja umożliwia zarządzanie buforowaniem danych, zapewniając aktualność informacji w aplikacji. Korzystając z @CacheEvict, programiści mogą usuwać określone wpisy z pamięci podręcznej podczas wykonywania określonych czynności, takich jak aktualizacja lub usuwanie danych. Jest to szczególnie przydatne w celu zachowania spójności danych i optymalizacji wydajności aplikacji. Korzystanie z @CacheEvict pomaga uniknąć sytuacji, w których w pamięci podręcznej pozostają nieaktualne informacje, co może prowadzić do błędów lub nieprawidłowych wyników.

Klasa BookController implementuje punkty końcowe dla wszystkich żądań związanych z tworzeniem API. Ten kontroler jest odpowiedzialny za przetwarzanie żądań, zarządzanie danymi książek i dostarczanie odpowiednich odpowiedzi klientom. Optymalizacja kontrolera BookController zapewnia wydajne środowisko użytkownika i poprawia wydajność API.

Adnotacje @GetMapping, @PostMapping i @PutMapping są używane w Springu do wskazywania wywołania odpowiednich metod HTTP na danej ścieżce określonej w parametrze. Adnotacje te upraszczają tworzenie usług sieciowych RESTful, umożliwiając programistom łatwe zarządzanie trasami i przetwarzanie żądań HTTP. Adnotacja @GetMapping odpowiada za przetwarzanie żądań GET, @PostMapping odpowiada za żądania POST, a @PutMapping odpowiada za żądania PUT, dzięki czemu kod jest bardziej czytelny i łatwiejszy w utrzymaniu. Korzystanie z tych adnotacji pozwala efektywnie organizować interakcje między klientem a serwerem w aplikacjach internetowych.

Zwróć uwagę na funkcję findAll(), która odpowiada za uzyskanie listy wszystkich książek. Mierzymy czas wykonania tej operacji i zapisujemy wynik w dzienniku. Pozwala to monitorować wydajność i optymalizować operacje na bazie danych.

Aby włączyć buforowanie w aplikacji, należy dodać adnotację @EnableCaching do klasy głównej. Ta czynność umożliwi systemowi uruchomienie postprocesora, który przetworzy inne adnotacje związane z buforowaniem. Implementacja tej adnotacji jest kluczowym krokiem w optymalizacji działania aplikacji i zwiększeniu jej wydajności.

Wdrażanie aplikacji i baz danych

Aby sprawnie wdrożyć trzy usługi – MySQL, Redis i aplikację – użyjemy Dockera. To narzędzie pozwala na tworzenie izolowanych kontenerów dla każdej usługi, co zapewnia wygodne zarządzanie i skalowalność. Podczas przygotowań utworzymy obrazy Dockera i skonfigurujemy niezbędne elementy, aby zapewnić prawidłowe działanie wszystkich komponentów. Takie podejście zapewni niezawodność oraz łatwość wdrażania i zarządzania usługami.

Utworzenie pliku Dockerfile to ważny krok w procesie opisywania obrazu aplikacji. Plik Dockerfile zawiera instrukcje niezbędne do zbudowania obrazu, który będzie używany do uruchamiania kontenerów. W tym pliku możesz określić obraz bazowy, zainstalować zależności, skonfigurować środowisko i zdefiniować polecenia, które zostaną wykonane podczas uruchamiania kontenera. Prawidłowo napisany plik Dockerfile usprawni proces wdrażania i zarządzania aplikacją oraz zapewni jej zgodność z różnymi środowiskami. Pozwoli to na łatwe skalowanie aplikacji i jej aktualizację.

Utwórzmy plik docker-compose opisujący kilka powiązanych kontenerów. Ten plik umożliwia zarządzanie konfiguracją i uruchamianiem wielu usług, upraszczając proces wdrażania i zarządzania aplikacjami. Za pomocą docker-compose można szybko tworzyć, modyfikować i skalować kontenery, a także organizować interakcje między nimi. Jest to szczególnie przydatne podczas tworzenia i testowania architektur wielousługowych. Prawidłowa konfiguracja pliku docker-compose może znacznie zwiększyć wydajność pracy z kontenerami i poprawić ich integrację w ramach projektu.

Plik zawiera opisy trzech usług, w tym nazwy kontenerów, obrazy i oznaczenia portów. Parametr środowiskowy służy do ustawiania zmiennych środowiskowych, co pozwala dostosować konfigurację każdej usługi w zależności od jej środowiska.

Konfiguracje są wprowadzane w pliku application.properties. Ten plik jest kluczowy dla konfiguracji aplikacji. Można w nim skonfigurować różne parametry, takie jak ustawienia połączenia z bazą danych, opcje buforowania i inne ważne właściwości wpływające na działanie aplikacji. Prawidłowa edycja pliku application.properties pozwala zoptymalizować wydajność i niezawodność projektu. Przed uruchomieniem aplikacji należy przetestować wszystkie zmiany, aby upewnić się, że działa stabilnie.

Pamiętaj, że parametry spring.datasource.url i spring.redis.host muszą określać adresy hostów kontenerów. Jest to ważne dla prawidłowego połączenia z bazą danych i serwerem Redis w aplikacji. Prawidłowa konfiguracja tych parametrów pomoże zapewnić niezawodne działanie aplikacji i efektywny dostęp do niezbędnych zasobów. Upewnij się, że adresy kontenerów są poprawnie określone, aby uniknąć problemów z połączeniem.

Parametr spring.cache.redis.time-to-live określa czas życia danych w pamięci podręcznej przechowywanych w Redis. Ten parametr pozwala efektywnie zarządzać buforowaniem poprzez ustawienie daty wygaśnięcia obiektów buforowanych. Ustawienie optymalnej wartości czasu życia pomaga skrócić czas reakcji aplikacji i zmniejszyć obciążenie bazy danych. Prawidłowa konfiguracja tego ustawienia jest ważna dla utrzymania aktualności danych i poprawy wydajności systemu.

Do wykonania tego zadania służą polecenia. Pozwalają one efektywnie zarządzać procesami i automatyzować działania. Prawidłowe korzystanie z poleceń znacznie upraszcza zadania i zwiększa produktywność. Ważne jest, aby wiedzieć, które polecenia są dostępne i jak ich używać, aby osiągnąć pożądane rezultaty. Pomoże to zoptymalizować przepływy pracy i poprawić jakość zadań.

Aby skompilować projekt do pliku JAR, użyj polecenia ./mvnw clean package -Dmaven.test.skip=true . To polecenie czyści poprzednie kompilacje i tworzy nowy plik JAR, pomijając testy. Takie podejście może przyspieszyć proces kompilacji, szczególnie w sytuacjach, gdy testowanie nie jest priorytetem. Przed uruchomieniem tego polecenia upewnij się, że znajdujesz się w katalogu głównym swojego projektu Maven.

Polecenie docker-compose up uruchamia proces wykonywania pliku docker-compose.yml, który obejmuje zbudowanie trzech obrazów i utworzenie odpowiednich kontenerów. To polecenie jest kluczowe w zarządzaniu aplikacjami wielokontenerowymi, umożliwiając programistom łatwe wdrażanie i skalowanie usług. Prawidłowe użycie docker-compose upraszcza proces tworzenia i testowania, zapewniając spójne środowisko dla wszystkich komponentów aplikacji.

Wyniki zostaną wyświetlone w terminalu.

Pomyślne kompilacje są oznaczone czterema ostatnimi wierszami.

Testowanie efektu buforowania

Aby przetestować funkcjonalność usług, należy kilkukrotnie wykonać żądanie POST, które dodaje nową książkę. Ten proces pomoże upewnić się, że API działa poprawnie i jest w stanie obsłużyć żądania dodawania danych. Regularne testowanie takich żądań pozwala zidentyfikować ewentualne błędy i poprawić stabilność usługi.

Operację tę można wykonać za pośrednictwem terminala lub narzędzia Postman. Oba narzędzia umożliwiają wygodną interakcję z API i wykonywanie żądań. Korzystanie z terminala jest odpowiednie dla programistów preferujących wiersz poleceń, natomiast narzędzie Postman zapewnia graficzny interfejs, upraszczając proces testowania i pracy z API. Wybierz metodę, która najwygodniej Ci rozwiązać problem.

W następnym terminalu uruchom wskazane polecenia.

Połączenie z kontenerem Redis pozwala nam sprawdzić, czy książki dodane do bazy danych są również pomyślnie zapisywane w pamięci podręcznej. Aby zapewnić dokładność eksperymentu, wcześniej wyczyścimy pamięć podręczną.

Połączenie z głównym kontenerem aplikacji w celu odczytu logów odbywa się za pomocą specjalnego polecenia. Ten proces umożliwia dostęp do informacji w logach, co może być przydatne do diagnozowania i monitorowania aplikacji. Upewnij się, że masz niezbędne uprawnienia do uruchomienia tego polecenia. Po pomyślnym nawiązaniu połączenia będziesz mógł przeglądać i analizować logi, aby zidentyfikować potencjalne problemy lub poprawić wydajność aplikacji.

Flaga -f służy do odczytu logów w czasie rzeczywistym, umożliwiając wyświetlanie nowych wpisów w momencie ich pojawiania się w konsoli. Identyfikator kontenera, taki jak 6f767bc19768, można uzyskać za pomocą polecenia docker ps.

Następnie wielokrotnie wykonujemy zapytanie, aby pobrać listę książek.

Logi wyświetlają następujący wynik:

Pierwsze zapytanie do bazy danych MySQL zajęło 676 milisekund (czas trwania), co wskazuje czas potrzebny na pobranie wyników. Natomiast wyniki dwóch kolejnych zapytań zostały pobrane z pamięci podręcznej, co pozwoliło na ich 60-krotnie szybsze wykonanie. Podkreśla to znaczenie buforowania dla optymalizacji wydajności bazy danych i skrócenia czasu odpowiedzi. Korzystanie z pamięci podręcznej może znacznie przyspieszyć dostęp do często używanych danych, co jest szczególnie ważne dla poprawy wydajności aplikacji internetowych.

Ponowne testowanie po wyczyszczeniu pamięci podręcznej potwierdza wyniki. Czyszczenie pamięci podręcznej to ważna procedura zapewniająca trafność informacji i korygująca ewentualne błędy. Po zakończeniu tego zadania wyniki testów wykazują znaczną poprawę. Podkreśla to wagę regularnego czyszczenia pamięci podręcznej w celu utrzymania optymalnej wydajności i funkcjonalności witryny.

Pomyślnie zademonstrowaliśmy skuteczność wykorzystania Redis do buforowania danych, co znacznie przyspiesza interakcje z relacyjną bazą danych. Jako wydajny magazyn danych w pamięci, Redis znacząco skraca czas reakcji i poprawia ogólną wydajność aplikacji. Wdrożenie buforowania z Redis optymalizuje pracę z relacyjnymi bazami danych, co jest szczególnie ważne w przypadku projektów z dużą liczbą żądań i danych.