Стратегия кэширования L1 + L2 с использованием Spring Cacheable
Я пытаюсь настроить стратегию кэширования L1 + L2 для использования с @Cacheable
аннотаций. Моя цель
- Настроить кофеин кэш
- Настроить Redis Cache
- Поищите предмет в Кэше кофеина, если найден возврат, иначе шаг 4
- Найдите элемент в Redis Cache, если найдены возврат и кэш в кофеине, иначе шаг 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 требует от вас реализации двух простых методов.