Я пытаюсь настроить стратегию кэширования L1 + L2 для использования с аннотацией @Cacheable. Моя цель
Я знаю, что это не поддерживается из коробки, но я пытался прочитать документацию о том, как подключить такое решение.
Мое текущее решение состоит в том, чтобы обернуть мою фактическую службу в RedisBackedService, который имеет redisCacheManager в аннотации cacheable, который, в свою очередь, завернут в CaffeineBackedService, который имеет caffeineCacheManager в аннотации cacheable. Излишне говорить, что это кажется лишним.
Любые указатели были бы полезны.
Уровень 1 (местный) и уровень 2 (удаленный). Я мог бы сделать это вручную, но тогда я теряю силу кешируемой аннотации. Вы говорите, что я должен внедрить собственный кеш (который проверяет redis и кофеин) в настраиваемый менеджер?
да. На самом деле это не так сложно, и вы все равно можете извлечь выгоду из всего, что может предложить @Cacheable. Вам даже не нужна реализация CacheManager, вы можете просто зарегистрировать свои собственные кэши в SimpleCacheManager, если знаете их заранее.
Спасибо. Я это попробую. Оцените руководство




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