Можно ли установить другую спецификацию для каждого кеша с использованием кофеина при весенней загрузке?

У меня есть простое приложение для загрузки спринта, использующее весеннюю загрузку 1.5.11.RELEASE с @EnableCaching в классе Application Configuration.

pom.xml

 <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>

application.properties

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. Я что-то пропустил? Возможно, есть более подходящий провайдер для моего случая использования?

Мы отзеркалили адаптер Guava, и я не знаю, почему он был ограничен глобальными конфигурациями. Есть пул реквест, чтобы добавить это. В прошлом команда Spring рекомендовала использовать конфигурацию Java в качестве временного решения. Попробуйте спросить @snicoll

Ben Manes 17.04.2018 21:11

@BenManes, спасибо за это, можете ли вы указать мне на пример использования конфигурации Java? Он по-прежнему использует кофеин в качестве основного менеджера? На самом деле я не особо разбираюсь в том, какой имплант я использую, я просто хочу, чтобы он мог это сделать;)

David 18.04.2018 08:53

Может одна из этих ссылок поможет? 1, 2, 3

Ben Manes 18.04.2018 08:59

Самый полезный ответ от @Stephane Nicoll В Spring CaffeineCacheManager добавлено несколько кешей загрузки кофеина

Grigory Kislin 12.12.2018 13:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
28
4
10 814
3

Ответы 3

Это ваш единственный шанс:

@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());.

pards 30.11.2020 21:47

Проверьте, есть ли в вашей конфигурации @EnableCaching. Нет необходимости регистрировать кеш вручную.

membersound 01.12.2020 09:48

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

RichieK 03.07.2020 10:59

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