Spring cache

Проработать

  1. Кэширование данных в приложении на Spring Boot
  2. Кэш. Теория кэширования. Устройство и разновидности кэша
  3. Алгоритмы кэширования

Что это

Кэш - участок оперативной памяти содержащий информацию, которая часто запрашивается. Spring cache хранит кеш в ConcurrentMapCache. В качестве ключа использует все входящие параметры метода.

Быстрый старт в Spring boot

Добавить зависимость - spring-boot-starter-cache

Над конфигурационным классом(@Configuration) добавить аннотацию @EnableCaching.

Указать аннотацию @Cacheable над необходимым методом(в слое service) с параметром имени кеша - @Cacheable("userCache").

Если метод возвращает exception кеш отрабатывать не будет.

@Cacheable

@Cacheable - имеет параметр key, в котором можно указать что использовать в качестве ключа для кеша.

Cacheable(key = "#lastName")
        

@CachePut

@CachePut - аннотация для обновления кеша. Ставиться над update методами на service слоях, c параметром имени кеша - @Cacheable("userCache").

@CacheEvict

@CacheEvict - указывает, что метод вызывает удаление из кеша, параметром имени кеша - @Cacheable("userCache").

Имеет дополнительный параметр allEntries = true - для удаление всех кешей по данному имени кеша.

@CacheConfig

@CacheConfig - общая аннотация на класс service в которой можно указать cacheNames для именнования кеша для всех кеш аннотаций в классе.

CacheManager

CacheManager класс который можно использовать для прямой работы с кешем.

//spring injection
private final CacheManager cacheManager;

cacheManager.getCache("userCache");
        

LRU Cache - least recently use

LRU - алгоритм вытесняющий значения которые дольше всего не запрашивались. Соответственно, необходимо хранить время последнего запроса к значению. И как только число закэшированных значений превосходит N необходимо вытеснить из кеша значение, которое дольше всего не запрашивалось.

Для реализации этого метода нам понадобятся две структуры данных:

  1. Хеш-таблица hashTable, которая будет хранить непосредственно закэшированные значения.
  2. Очередь с приоритетами timeQueue. Структура, которая поддерживает следующие операции:
    • Добавить пару значение и приоритет timeQueue.Add(val, priority).
    • Извлечь (удалить и вернуть) значение с наименьшим приоритетом timeQueue.extractMinValue().