3

我们需要实现几种具有不同缓存时间的方法。每种方法都带有注释,@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恕我直言,与 eg 相比的主要优点SimpleCacheManager是可以定义基本配置,然后延迟初始化其他缓存。但是,如果您能够设置永远不会重新初始化的附加缓存,那不是很好吗?

这些缓存必须优先使用并在CachingConfigurerSupport.

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

4

2 回答 2

1

最近我决定把我最初的 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 的行为。

于 2019-01-06T19:28:52.930 回答
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())
        }
    }
}
于 2021-05-22T13:42:06.260 回答