在Spring中配置特定的咖啡因缓存

时间:2018-08-17 07:44:02

标签: spring spring-cache caffeine

我们需要实现几种具有不同缓存时间的方法。每个方法都用@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中创建它们。

也许我遗漏了一些东西,但是这不应该解决已经在多个主题中以不同形式讨论的问题吗?

2 个答案:

答案 0 :(得分:0)

最近我决定将我的initial PR变成一个单独的tiny project

要开始使用它,只需从Maven Central添加最新的依赖项:

<dependency>
    <groupId>io.github.stepio.coffee-boots</groupId>
    <artifactId>coffee-boots</artifactId>
    <version>1.0.2</version>
</dependency>

属性格式如下:

coffee-boots.cache.spec.myCache=maximumSize=100000,expireAfterWrite=1m

如果未定义任何特定配置,则CacheManager默认为Spring的行为。

答案 1 :(得分:0)

没有任何第三方库的简单方法:

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())
        }
    }
}