У меня есть простое приложение для загрузки спринта, использующее весеннюю загрузку 1.5.11.RELEASE с @EnableCaching в классе Application Configuration.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
spring.cache.type=caffeine
spring.cache.cache-names=cache-a,cache-b
spring.cache.caffeine.spec=maximumSize=100, expireAfterWrite=1d
Мой вопрос прост: как указать другой размер / срок действия для каждого кеша. Например. возможно, для cache-a допустимо быть действительным для 1 day. Но cache-b может подойти для 1 week. Спецификация кэша кофеина, по-видимому, является глобальной для CacheManager, а не для Cache. Я что-то пропустил? Возможно, есть более подходящий провайдер для моего случая использования?
@BenManes, спасибо за это, можете ли вы указать мне на пример использования конфигурации Java? Он по-прежнему использует кофеин в качестве основного менеджера? На самом деле я не особо разбираюсь в том, какой имплант я использую, я просто хочу, чтобы он мог это сделать;)
Самый полезный ответ от @Stephane Nicoll В Spring CaffeineCacheManager добавлено несколько кешей загрузки кофеина




Это ваш единственный шанс:
@Bean
public CaffeineCache cacheA() {
return new CaffeineCache("CACHE_A",
Caffeine.newBuilder()
.expireAfterAccess(1, TimeUnit.DAYS)
.build());
}
@Bean
public CaffeineCache cacheB() {
return new CaffeineCache("CACHE_B",
Caffeine.newBuilder()
.expireAfterWrite(7, TimeUnit.DAYS)
.recordStats()
.build());
}
Просто выставьте свои собственные кеши как beans. Они автоматически добавляются в CaffeineCacheManager.
Для использования с @Cacheable мне пришлось вручную зарегистрировать их на CacheManager, используя cacheManager.registerCustomCache(name, cache.getNativeCache());.
Проверьте, есть ли в вашей конфигурации @EnableCaching. Нет необходимости регистрировать кеш вручную.
Я преобразовал свой первоначальный PR в отдельный крошечный проект.
Чтобы начать использовать, просто добавьте последнюю зависимость от Maven Central:
<dependency>
<groupId>io.github.stepio.coffee-boots</groupId>
<artifactId>coffee-boots</artifactId>
<version>2.0.0</version>
</dependency>
Формат свойств следующий:
coffee-boots.cache.spec.myCache=maximumSize=100000,expireAfterWrite=1m
Если конкретная конфигурация не определена, CacheManager по умолчанию использует поведение Spring.
Я настраиваю несколько диспетчеров кешей следующим образом
@Bean
public CacheManager template() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager(CACHE_TEMPLATE);
cacheManager.setCaffeine(caffeineCacheBuilder(this.settings.getCacheExpiredInMinutes()));
return cacheManager;
}
@Bean
public CacheManager daily() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager(CACHE_TEMPLATE);
cacheManager.setCaffeine(caffeineCacheBuilder(24 * 60));
return cacheManager;
}
И использовать кеш нормально
@Cacheable(cacheManager = "template")
@Override
public ArrayList<FmdModel> getData(String arg) {
return ....;
}
Похоже, что в приведенном выше коде есть большая ошибка. Так что я перехожу на
@Configuration
@Data
@Slf4j
@ConfigurationProperties(prefix = "caching")
public class AppCacheConfig {
//This cache spec is load from `application.yml` file
// @ConfigurationProperties(prefix = "caching")
private Map<String, CacheSpec> specs;
@Bean
public CacheManager cacheManager(Ticker ticker) {
SimpleCacheManager manager = new SimpleCacheManager();
if (specs != null) {
List<CaffeineCache> caches = specs.entrySet().stream()
.map(entry -> buildCache(entry.getKey(), entry.getValue(), ticker)).collect(Collectors.toList());
manager.setCaches(caches);
}
return manager;
}
private CaffeineCache buildCache(String name, CacheSpec cacheSpec, Ticker ticker) {
log.info("Cache {} specified timeout of {} min, max of {}", name, cacheSpec.getTimeout(), cacheSpec.getMax());
final Caffeine<Object, Object> caffeineBuilder = Caffeine.newBuilder()
.expireAfterWrite(cacheSpec.getTimeout(), TimeUnit.MINUTES).maximumSize(cacheSpec.getMax())
.ticker(ticker);
return new CaffeineCache(name, caffeineBuilder.build());
}
@Bean
public Ticker ticker() {
return Ticker.systemTicker();
}
}
Этот класс AppCacheConfig позволяет вам определять многие спецификации кеша по своему усмотрению.
И вы можете определить спецификацию кеша в файле application.yml
caching:
specs:
template:
timeout: 10 #15 minutes
max: 10_000
daily:
timeout: 1440 #1 day
max: 10_000
weekly:
timeout: 10080 #7 days
max: 10_000
...:
timeout: ... #in minutes
max:
Но все же у этого класса есть ограничение: мы можем установить только размер timeout и max. из-за класса CacheSpec
@Data
public class CacheSpec {
private Integer timeout;
private Integer max = 200;
}
Следовательно, если вы хотите добавить больше параметров конфигурации, вы должны добавить больше параметров в класс CacheSpec и установить конфигурацию Cache для функции AppCacheConfig.buildCache.
Надеюсь на эту помощь!
в чем большая ошибка? здесь, кажется, у меня работает ... я определил один bean-компонент как основной, а другой менеджер должен быть, но в кэшируемой аннотации, как и вы ..?
Мы отзеркалили адаптер Guava, и я не знаю, почему он был ограничен глобальными конфигурациями. Есть пул реквест, чтобы добавить это. В прошлом команда Spring рекомендовала использовать конфигурацию Java в качестве временного решения. Попробуйте спросить @snicoll