spring-boot
Cache med Redis med vårstart för MongoDB
Sök…
Varför cache?
Idag är prestanda en av de viktigaste mätvärdena vi behöver utvärdera när vi utvecklar en webbtjänst / applikation. Att hålla kunderna engagerade är avgörande för alla produkter och av detta skäl är det oerhört viktigt att förbättra prestandan och minska sidbelastningstiderna.
När du kör en webbserver som interagerar med en databas kan dess verksamhet bli en flaskhals. MongoDB är inget undantag här, och när vår MongoDB-databas skalas upp kan saker verkligen sakta. Det här problemet kan till och med bli värre om databasservern kopplas bort från webbservern. I sådana system kan kommunikationen med databasen orsaka en stor omkostnad.
Lyckligtvis kan vi använda en metod som heter cache för att påskynda saker. I det här exemplet kommer vi att introducera den här metoden och se hur vi kan använda den för att förbättra prestandan för vår applikation med Spring Cache, Spring Data och Redis.
Det grundläggande systemet
Som det första steget bygger vi en grundläggande webbserver som lagrar data i MongoDB. För denna demonstration kommer vi att kalla det ”snabbt bibliotek”. Servern har två grundläggande operationer:
POST /book
: Denna slutpunkt får titeln, författaren och innehållet i boken och skapar en bokpost i databasen.
GET /book/ {title}
: Denna slutpunkt får en titel och returnerar dess innehåll. Vi antar att titlar identifierar böcker på ett unikt sätt (det kommer därför inte att finnas två böcker med samma titel). Ett bättre alternativ skulle naturligtvis vara att använda ett ID. Men för att hålla sakerna enkla använder vi helt enkelt titeln.
Detta är ett enkelt bibliotekssystem, men vi lägger till mer avancerade förmågor senare.
Låt oss nu skapa projektet med Spring Tool Suite (bygga med eclipse) och vårstartprojektet
Vi bygger vårt projekt med Java och för att bygga använder vi maven, väljer värden och klickar på nästa
Välj MongoDB, Redis från NOSQL och Web från webbmodulen och klicka på finish. Vi använder Lombok för automatisk generering av Setters och moduler av modellvärden så vi måste lägga till Lombok-beroendet till POM
MongoDbRedisCacheApplication.java innehåller huvudmetoden som används för att köra Spring Boot Application add
Skapa modellklass Bok som innehåller id, boktitel, författare, beskrivning och kommentera med @Data för att generera automatiska inställningar och brev från jar project 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 skapar alla grundläggande CRUD-operationer för oss automatiskt så låt oss skapa BookRepository.Java som hittar bok efter titel och tar bort bok
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);
}
Låt oss skapa webservicesController som sparar data till MongoDB och hämtar data med idTitle (@PathVariable String title).
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;
}
}
Lägga till cachen Hittills har vi skapat en grundläggande bibliotekstjänst, men det är inte förvånansvärt snabbt alls. I det här avsnittet kommer vi att försöka optimera metoden findBookByTitle () genom att bibehålla resultaten.
För att få en bättre uppfattning om hur vi ska uppnå detta mål, låt oss gå tillbaka till exemplet på de människor som sitter i ett traditionellt bibliotek. Låt oss säga att de vill hitta boken med en viss titel. Först ska de titta runt bordet för att se om de redan har tagit det dit. Om de har det är det fantastiskt! De hade bara en cache-hit som hittar ett objekt i cachen. Om de inte har hittat det, hade de en cachemiss, vilket betyder att de inte hittade objektet i cachen. Om det saknas objekt måste de leta efter boken i biblioteket. När de hittar det kommer de att hålla det på sitt bord eller infoga det i cachen.
I vårt exempel följer vi exakt samma algoritm för metoden findBookByTitle (). När vi frågar om en bok med en viss titel, letar vi efter den i cachen. Om det inte hittas, letar vi efter det i huvudlagret, det är vår MongoDB-databas.
Med Redis
Att lägga till spring-boot-data-redis till vår klassväg gör det möjligt för spring boot att utföra sin magi. Det skapar alla nödvändiga operationer genom automatisk konfigurering
Låt oss nu kommentera metoden med nedanstående rad för att cache och låt vårstart göra sin magi
@Cacheable (value = "book", key = "#title")
För att radera från cachen när en post raderas, kommentera bara med nedanstående rad i BookRepository och låt Spring Boot hantera cache-radering för oss.
@CacheEvict (value = "book", key = "#title")
För att uppdatera uppgifterna måste vi lägga till nedanstående rad till metoden och låta våren starta
@CachePut(value = "book", key = "#title")
Du hittar hela projektkoden på GitHub