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

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

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

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

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

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

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, Если вам нужно создать их на лету, CacheManager API требует от вас реализации двух простых методов.

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