Конфигурация для определенных кешей с кофеином весной

Нам нужно реализовать несколько методов с разным временем кеширования. Каждый метод помечен @Cacheable, и наше текущее решение включает несколько CacheManager, которые установлены в CachingConfigurerSupport.

public class CachingConfiguration extends CachingConfigurerSupport {

  @Override
  @Bean
  public CacheManager cacheManager() {
    CaffeineCacheManager cacheManager = new CaffeineCacheManager();
    cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.DAYS));
    return cacheManager;
  }

  @Bean
  public CacheManager anotherCache() {
    CaffeineCacheManager cacheManager = new CaffeineCacheManager();
    cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES));
    return cacheManager;
  }
}

Затем аннотация @Cacheable включала cacheManager: @Cacheable (cacheNames = "someCache", cacheManager = "anotherCache")

В основном это нормально, но также возникает ошибка, если вы забыли параметр cacheManager и т. Д.

Поэтому в настоящее время я пытаюсь найти лучшее решение, но, насколько я понимаю, в настоящее время нет общепринятого пути.

Имхо главное преимущество CaffeineCacheManager по сравнению, например, с SimpleCacheManager - это возможность определить базовую конфигурацию, а затем лениво инициализировать дополнительные кеши. Но было бы здорово, если бы вы могли установить дополнительные кеши, которые никогда не инициализируются повторно?

Эти кеши должны использоваться преимущественно и создаваться в CachingConfigurerSupport.

Может быть, я что-то упускаю, но разве это не должно решить проблему, которая уже обсуждалась в нескольких потоках в разных формах?


person deveth0    schedule 17.08.2018    source источник
comment
Возможно, вы захотите присоединиться к этому запросу на вытягивание. Интеграция была прямым портом предыдущей версии Guava.   -  person Ben Manes    schedule 17.08.2018
comment
Также см. Этот ответ - «предоставлять отдельные кеши как @Beans и Spring Boot автоматически обнаружат это и создадут для вас CacheManager »   -  person Ben Manes    schedule 17.08.2018
comment
Спасибо @Ben Я надеялся, что вы найдете этот вопрос;) отображение отдельных кешей как Beans в порядке, но не совсем настраиваемое. По возможности постараюсь помочь в пиаре   -  person deveth0    schedule 17.08.2018
comment
Новый PR создан github.com/spring-projects/spring-framework/pull/1932   -  person deveth0    schedule 18.08.2018


Ответы (2)


Недавно я решил превратить мой первоначальный 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.

person stepio    schedule 06.01.2019

Простой способ без какой-либо сторонней библиотеки:

spring.cache.type=caffeine
# default spec (optional)
spring.cache.caffeine.spec=maximumSize=250,expireAfterWrite=15m
# specific specs (also optional)
caffeine.specs.places=maximumSize=1000,expireAfterWrite=1h

Зарегистрируйте кастомные кеши:

applicationContext.registerBean { context ->
    CacheManagerCustomizer<CaffeineCacheManager> { cacheManager ->
        for (spec in Binder.get(context.environment).bindOrCreate("caffeine.specs", HashMap::class.java)) {
            cacheManager.registerCustomCache(spec.key.toString(), Caffeine.from(spec.value.toString()).build())
        }
    }
}
person Vladimir Konkov    schedule 22.05.2021