Стратегия кэширования L1 + L2 с использованием Spring Cacheable

Я пытаюсь настроить стратегию кэширования L1 + L2 для использования с аннотацией @Cacheable. Моя цель

  1. Настроить кэш кофеина
  2. Настроить Redis Cache
  3. Найдите предмет в кэше с кофеином, если он найден, верните его, в противном случае шаг 4
  4. Найдите элемент в Redis Cache, если он найден, возврат и кеш в кофеине, в противном случае шаг 5
  5. Воспользуйтесь реальным сервисом, чтобы вернуть результат.

Я знаю, что это не поддерживается из коробки, но я пытался прочитать документацию о том, как подключить такое решение.

Мое текущее решение состоит в том, чтобы обернуть мою фактическую службу в RedisBackedService, который имеет redisCacheManager в аннотации cacheable, который, в свою очередь, завернут в CaffeineBackedService, который имеет caffeineCacheManager в аннотации cacheable. Излишне говорить, что это кажется лишним.

Любые указатели были бы полезны.

Что вы имеете в виду под кешем L1? В каком контексте? Вы можете легко создать экземпляр Cache, который будет делегировать кофеину и откатиться на redis, если он не найден. Интерфейс CacheManager состоит из двух методов и к тому же очень прост.

Stephane Nicoll 16.12.2018 09:55

Уровень 1 (местный) и уровень 2 (удаленный). Я мог бы сделать это вручную, но тогда я теряю силу кешируемой аннотации. Вы говорите, что я должен внедрить собственный кеш (который проверяет redis и кофеин) в настраиваемый менеджер?

Adil F 17.12.2018 09:36

да. На самом деле это не так сложно, и вы все равно можете извлечь выгоду из всего, что может предложить @Cacheable. Вам даже не нужна реализация CacheManager, вы можете просто зарегистрировать свои собственные кэши в SimpleCacheManager, если знаете их заранее.

Stephane Nicoll 17.12.2018 10:38

Спасибо. Я это попробую. Оцените руководство

Adil F 17.12.2018 18:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
3
4
1 384
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, чтобы завершить здесь и предоставить ответ на основе комментариев, это не функция абстракции кеша, но SPI абстракции кеша достаточно прост, чтобы вы могли реализовать что-то самостоятельно.

public class FallbackCache implements Cache {

  private final Cache primaryCache;
  private final Cache fallbackCache;

  FallbackCache(Cache primaryCache, Cache fallbackCache) { ... }

  public ValueWrapper get(Object key) {
    ValueWrapper wrapper = primaryCache.get(key);
    if (wrapper != null) {
      return wrapper;
    }
    return fallbackCache.get(key);
  }

  // other methods

}

Некоторые методы, такие как собственный метод доступа к кешу, могут быть немного сложными для этого варианта использования. Я бы вернул первичный кеш и скрыл бы факт отката от вызывающего.

Если вы заранее знаете свои кеши, вы можете создать их и обернуть в SimpleCacheManager. Если вам нужно создавать их на лету, API CacheManager требует, чтобы вы реализовали два простых метода.

Другие вопросы по теме