Стратегия кэширования L1 + L2 с использованием Spring Cacheable - PullRequest
0 голосов
/ 14 декабря 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 18 декабря 2018

Итак, чтобы сделать вывод и дать ответ на основе комментариев, это не особенность абстракции кеша, но 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 требует, чтобы вы реализовали два простых метода.

...