Поиск…


Почему кеширование?

Сегодня производительность является одной из наиболее важных показателей, которые необходимо оценить при разработке веб-сервиса / приложения. Поддержание вовлеченности клиентов имеет решающее значение для любого продукта, и по этой причине чрезвычайно важно улучшить производительность и сократить время загрузки страницы.

При запуске веб-сервера, который взаимодействует с базой данных, его операции могут стать узким местом. MongoDB здесь не является исключением, и по мере того, как наша база данных MongoDB масштабируется, все может действительно замедляться. Эта проблема может даже ухудшиться, если сервер базы данных отсоединен от веб-сервера. В таких системах связь с базой данных может вызвать большие накладные расходы.

К счастью, мы можем использовать метод caching для ускорения работы. В этом примере мы представим этот метод и посмотрим, как мы можем использовать его для повышения производительности нашего приложения с использованием Spring Cache, Spring Data и Redis.

Базовая система

В качестве первого шага мы создадим базовый веб-сервер, который хранит данные в MongoDB. Для этой демонстрации мы назовем ее «быстрой библиотекой». Сервер будет иметь две основные операции:

POST /book : эта конечная точка получит название, автора и содержание книги и создаст запись в базе данных.

GET /book/ {title} : эта конечная точка получит заголовок и вернет его содержимое. Мы предполагаем, что названия однозначно идентифицируют книги (таким образом, не будет двух книг с одним и тем же названием). Лучшей альтернативой было бы, конечно, использовать идентификатор. Однако, чтобы все было просто, мы просто используем заголовок.

Это простая библиотечная система, но позже мы добавим более сложные возможности.

Теперь давайте создадим проект, используя Spring Tool Suite (сборка с использованием eclipse) и проект Spring Starter

введите описание изображения здесь

Мы строим наш проект с использованием Java, и для сборки мы используем maven, выбираем значения и нажимаем на следующий

введите описание изображения здесь

Выберите MongoDB, Redis из NOSQL и Web из веб-модуля и нажмите «Готово». Мы используем Lombok для автоматической генерации Setters и getters значений модели, поэтому нам нужно добавить зависимость Lombok к POM

введите описание изображения здесь введите описание изображения здесь

MongoDbRedisCacheApplication.java содержит основной метод, который используется для запуска Spring Boot Application add

Создать класс класса Книга, которая содержит id, название книги, автора, описание и аннотацию с помощью @Data для создания автоматических сеттеров и геттеров из 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 создает для нас все основные операции CRUD, поэтому давайте создадим BookRepository.Java, который находит книгу по названию и удаляет книгу

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);
}

Давайте создадим webservicesController, который сохраняет данные в MongoDB и извлекает данные по 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;
    }
}

Добавление кэша До сих пор мы создали базовый веб-сервис библиотеки, но это не удивительно быстро. В этом разделе мы попытаемся оптимизировать метод findBookByTitle () путем кэширования результатов.

Чтобы лучше понять, как мы достигнем этой цели, давайте вернемся к примеру людей, сидящих в традиционной библиотеке. Предположим, они хотят найти книгу с определенным названием. Прежде всего, они будут оглядываться вокруг стола, чтобы посмотреть, не привезли ли они туда. Если они есть, это здорово! У них просто был кеш-хит, который находит элемент в кеше. Если они их не нашли, у них был промах кеша, то есть они не нашли элемент в кеше. В случае недостающего элемента им придется искать книгу в библиотеке. Когда они его найдут, они будут держать их на столе или вставить в кеш.

В нашем примере мы будем следовать точно так же алгоритму метода findBookByTitle (). Когда его попросят создать книгу с определенным названием, мы будем искать ее в кеше. Если не найти, мы будем искать его в основном хранилище, то есть в нашей базе данных MongoDB.

Использование Redis

Добавление spring-boot-data-redis в наш путь к классу позволит весенней загрузке выполнять свою магию. Он будет создавать все необходимые операции путем автоматической настройки

Теперь давайте теперь аннотировать метод с нижеследующей строкой для кеширования и пусть весенняя загрузка сделает свою магию

@Cacheable (value = "book", key = "#title")

Чтобы удалить из кеша, когда запись удалена, просто добавьте в нее комментарии в строке ниже в окне BookRepository и дайте нам удалить кеш-память Spring Boot Spring.

@CacheEvict (value = "book", key = "#title")

Чтобы обновить данные, нам нужно добавить строку ниже к методу, и пусть весенний дескриптор загрузки

@CachePut(value = "book", key = "#title")

Вы можете найти полный код проекта в GitHub



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow