spring-boot
Buforowanie z Redis przy użyciu Spring Boot dla MongoDB
Szukaj…
Dlaczego buforowanie?
Dzisiaj wydajność jest jednym z najważniejszych wskaźników, które musimy ocenić, opracowując usługę / aplikację internetową. Utrzymanie zaangażowania klientów ma kluczowe znaczenie dla każdego produktu, dlatego niezwykle ważne jest poprawienie wydajności i skrócenie czasu ładowania strony.
Podczas działania serwera WWW, który współdziała z bazą danych, jego operacje mogą stać się wąskim gardłem. MongoDB nie jest tutaj wyjątkiem, a ponieważ nasza baza danych MongoDB skaluje się, wszystko może naprawdę zwolnić. Ten problem może się nawet pogorszyć, jeśli serwer bazy danych zostanie odłączony od serwera WWW. W takich systemach komunikacja z bazą danych może powodować duże obciążenie.
Na szczęście możemy użyć metody zwanej buforowaniem, aby przyspieszyć działanie. W tym przykładzie przedstawimy tę metodę i zobaczymy, jak możemy jej użyć do zwiększenia wydajności naszej aplikacji przy użyciu Spring Cache, Spring Data i Redis.
System podstawowy
Pierwszym krokiem będzie zbudowanie podstawowego serwera WWW, który przechowuje dane w MongoDB. Na potrzeby tej demonstracji nazwiemy ją „szybką biblioteką”. Serwer będzie miał dwie podstawowe operacje:
POST /book
: ten punkt końcowy otrzyma tytuł, autora i treść książki oraz utworzy pozycję książki w bazie danych.
GET /book/ {title}
: ten punkt końcowy otrzyma tytuł i zwróci jego zawartość. Zakładamy, że tytuły jednoznacznie identyfikują książki (dlatego nie będzie dwóch książek o tym samym tytule). Lepszą alternatywą byłoby oczywiście użycie identyfikatora. Jednak dla uproszczenia użyjemy tego tytułu.
Jest to prosty system biblioteczny, ale później dodamy bardziej zaawansowane umiejętności.
Teraz stwórzmy projekt za pomocą Spring Tool Suite (kompilacja za pomocą Eclipse) i Spring Starter Project
Budujemy nasz projekt za pomocą Javy i do budowy używamy maven, wybierz wartości i kliknij Dalej
Wybierz MongoDB, Redis z NOSQL i Web z modułu internetowego i kliknij koniec. Używamy Lombok do automatycznego generowania wartości ustawiających i pobierających wartości modeli, dlatego musimy dodać zależność Lombok do POM
MongoDbRedisCacheApplication.java zawiera główną metodę używaną do uruchamiania dodawania aplikacji Spring Boot
Utwórz modelową książkę Book, która zawiera identyfikator, tytuł książki, autora, opis i adnotacje za pomocą @Data, aby wygenerować automatyczne ustawiacze i pobieracze z projektu jar lombok
package com.example;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import lombok.Data;
@Data
public class Book {
@Id
private String id;
@Indexed
private String title;
private String author;
private String description;
}
Spring Data automatycznie tworzy dla nas wszystkie podstawowe operacje CRUD, dlatego utwórzmy BookRepository.Java, która wyszukuje książkę według tytułu i usuwa książkę
package com.example;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface BookRepository extends MongoRepository<Book, String>
{
Book findByTitle(String title);
void delete(String title);
}
Utwórzmy webservicesController, który zapisuje dane w MongoDB i pobiera dane według idTitle (tytuł @PathVariable String).
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebServicesController {
@Autowired
BookRepository repository;
@Autowired
MongoTemplate mongoTemplate;
@RequestMapping(value = "/book", method = RequestMethod.POST)
public Book saveBook(Book book)
{
return repository.save(book);
}
@RequestMapping(value = "/book/{title}", method = RequestMethod.GET)
public Book findBookByTitle(@PathVariable String title)
{
Book insertedBook = repository.findByTitle(title);
return insertedBook;
}
}
Dodawanie pamięci podręcznej Do tej pory stworzyliśmy podstawową usługę biblioteczną, ale nie jest ona wcale zaskakująco szybka. W tej sekcji postaramy się zoptymalizować metodę findBookByTitle (), buforując wyniki.
Aby lepiej zrozumieć, jak osiągniemy ten cel, wróćmy do przykładu ludzi siedzących w tradycyjnej bibliotece. Powiedzmy, że chcą znaleźć książkę o określonym tytule. Przede wszystkim rozejrzą się wokół stołu, aby sprawdzić, czy już go tam przynieśli. Jeśli tak, to świetnie! Właśnie trafili w pamięć podręczną, która znajduje element w pamięci podręcznej. Jeśli go nie znaleźli, brakowało im pamięci podręcznej, co oznacza, że nie znaleźli przedmiotu w pamięci podręcznej. W przypadku brakującego elementu będą musieli poszukać książki w bibliotece. Kiedy go znajdą, zachowają go na stole lub włożą do pamięci podręcznej.
W naszym przykładzie zastosujemy dokładnie ten sam algorytm dla metody findBookByTitle (). Zapytani o książkę z określonym tytułem, szukamy jej w pamięci podręcznej. Jeśli nie zostanie znaleziony, szukamy go w głównej pamięci, czyli naszej bazie danych MongoDB.
Korzystanie z Redis
Dodanie Spring-boot-data-redis do naszej ścieżki klasy pozwoli sprężynowemu bootowi wykonać magię. Stworzy wszystkie niezbędne operacje poprzez automatyczną konfigurację
Dodajmy teraz do pamięci podręcznej metodę z poniższym wierszem i pozwólmy, aby wiosenny rozruch wykonał swoją magię
@Cacheable (value = "book", key = "#title")
Aby usunąć z pamięci podręcznej po usunięciu rekordu, po prostu dodaj adnotację do poniższego wiersza w BookRepository i pozwól, aby Spring Boot zajął się dla nas usunięciem pamięci podręcznej.
@CacheEvict (value = "book", key = "#title")
Aby zaktualizować dane, musimy dodać metodę do poniższego wiersza i pozwolić, aby sprężyna uruchomiła się
@CachePut(value = "book", key = "#title")
Pełny kod projektu można znaleźć na GitHub