В этой статье описывается простой способ реализации службы кэширования в Java Spring Boot с использованием Google Guava CacheAPI.

Потребность в кеше

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

Чтобы свести к минимуму такую ​​задержку в сети и повысить общую производительность приложений, программистам необходимо определить возможности для временного локального хранения часто используемых данных, чтобы избежать избыточного/ненужного сетевого трафика.

Что мы можем кэшировать

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

Что такое кэш гуавы

Guava Cache — это библиотека, предоставленная Google для реализации простого внутрипроцессного хранилища кэшей. Guava Cache — это инкрементный кеш, больше похожий на ConcurrentMap, с дополнительной функцией, которая автоматически делает записи недействительными при определенных настраиваемых условиях истечения срока действия.

Пример реализации кэша Guava

Давайте посмотрим, как мы можем реализовать простое Cache-Store, используя библиотеку Guava Cache.

В оставшейся части статьи подробно описаны все шаги, необходимые для реализации техники кэширования. Если это полезно, вы также можете загрузить окончательный исходный код из Ссылка на GitHub — Реализация кэша Guava

Шаг 1: Создайте проект Spring Boot

Нам нужен один проект Spring Boot. Базовый скелет можно быстро создать с помощью https://start.spring.io/, как показано ниже:

Шаг 2. Напишите HTTP GET REST API

Напишите один пример REST API, как описано ниже. В этом API мы моделируем вызов серверной службы, добавляя преднамеренное время ожидания. На следующем шаге мы представим Guava Cache для кэширования ответа API и уменьшения общей задержки.

Когда мы создадим и запустим это приложение, оно выдаст приведенный ниже вывод, который показывает некоторую задержку, поскольку каждый раз, когда вызов отправляется в серверную службу для извлечения данных,

Шаг 3: Добавьте зависимость от гуавы

В файле build.gradle добавьте библиотеку Guava в список зависимостей как,

compile group: 'com.google.guava', name: 'guava', version: '30.0-jre'

Шаг 4: Определите класс, чтобы обеспечить кэш-хранилище для любого универсального типа ‹T›

Давайте назовем этот класс CacheStore, который может помочь нам создать экземпляр Cache для любого универсального типа.

Обратите внимание: expireAfterWrite() предоставляет возможность аннулировать записи кэша в соответствии с предоставленными параметрами.

Шаг 5: Определите Java Bean для создания нового Cache Store типа записи Employee

Шаг 6. Измените класс ApiController для реализации кэширования записей сотрудников.

Здесь, на этом этапе, мы будем хранить записи о сотрудниках в кэше Guava.

Обратите внимание:

  1. По первому запросу мы не найдем запись Employee в Cache. И нам нужно вызвать внутренний API, чтобы получить запись о сотруднике. (Здесь внутренний API имеет преднамеренную задержку для имитации HTTP-вызова по сети.)
  2. Извлеченная запись сотрудника должна быть сначала сохранена в кэше, прежде чем возвращаться потребителю.
  3. Для последующих запросов мы будем находить запись Employee в Cache. Мы можем немедленно вернуть кешированную запись Employee в ответе, пропустив вызов внутреннего API.
  4. На шаге №5 мы создали Cache-Store со сроком действия 120 секунд. Поэтому LoadingCache будет хранить запись о сотруднике только в течение 120 секунд. Guava Cache будет отслеживать время и аннулировать/удалять запись о сотруднике из кеша самостоятельно через 120 секунд.

Шаг 7: Демонстрация

Создайте и запустите приложение ApiController локально. Чтобы проверить кэширование, перейдите по URL-адресу:

http://localhost:8080/employee/1

Поскольку это будет первый вызов, ключ сотрудника «1» не будет найден в кэше. Поэтому будет запущен вызов внутренней службы, и мы увидим некоторую задержку в ответе.

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

Затем проверьте идентификатор другого сотрудника:

http://localhost:8080/employee/2

Этот новый ключ сотрудника «2» отсутствует в кэше. Поэтому для получения сведений инициируется вызов внутренней службы.

См. последовательные журналы ниже для всех 3 тестов:

Шаг 8. Повторное использование класса CacheStore‹T› для создания другого Cache-Store с записью другого типа.

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

Обратитесь к приведенному ниже примеру, чтобы узнать, какие изменения необходимы для создания любого нового Cache-Store:

Обратите внимание: здесь Product.java и ProductService.Java соответствуют тому же шаблону, что и ранее предоставленный Employee.Java. и EmployeeService.Java. Если вы заинтересованы, вы можете загрузить полный исходный код с GitHub Link — Implementing Guava Cache.

Обратите внимание, что productNameCachestore кэширует только обязательное поле, даже если серверная служба возвращает объект большего размера. Это позволяет избежать ненужной перегрузки памяти сервера приложений.

Резюме

В этой статье мы увидели простой способ реализации кэша Guava в Spring Boot.

Загрузите полный исходный код для этой статьи со страницы GitHub Link — Implementing Guava Cache

Удачного кодирования!