Spring boot 是否可以在spring boot中使用咖啡因为每个缓存设置不同的规范?

Spring boot 是否可以在spring boot中使用咖啡因为每个缓存设置不同的规范?,spring-boot,spring-cache,caffeine,Spring Boot,Spring Cache,Caffeine,我有一个简单的sprint启动应用程序,使用spring boot1.5.11。在应用程序配置类上使用@EnableCaching发布 pom.xml 问题: 我的问题很简单,如何为每个缓存指定不同的大小/过期时间。例如,cache-a在1天内有效可能是可以接受的。但是cache-b在1周内可能还可以。咖啡因缓存上的规范似乎是CacheManager的全局规范,而不是cache。我错过什么了吗?也许有一个更适合我的用例的提供者?这是您唯一的机会: @Bean public CaffeineCac

我有一个简单的sprint启动应用程序,使用spring boot
1.5.11。在应用程序
配置
类上使用
@EnableCaching
发布

pom.xml 问题:
我的问题很简单,如何为每个缓存指定不同的大小/过期时间。例如,
cache-a
1天内有效可能是可以接受的。但是
cache-b
1周内可能还可以。咖啡因缓存上的规范似乎是
CacheManager
的全局规范,而不是
cache
。我错过什么了吗?也许有一个更适合我的用例的提供者?

这是您唯一的机会:

@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());
}
只需将自定义缓存公开为bean。它们会自动添加到
CaffeineCacheManager

中。我将我的文件转换为单独的文件

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

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

如果没有定义特定的配置,
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 ....;
    }
但是,这个类仍然有一个限制,我们只能设置
timeout
max
大小。因为
CacheSpec
class

@Data
public class CacheSpec {

    private Integer timeout;
    private Integer max = 200;

}
因此,如果您想添加更多配置参数,您需要在
CacheSpec
类上添加更多参数,并在
AppCacheConfig.buildCache
函数上设置
Cache
配置

希望这有帮助

我们镜像了Guava适配器,我不知道为什么它只限于全局配置。有一种方法可以补充这一点。在过去,Spring团队建议使用Java配置作为解决方案。试着问@snicoll@BenManes谢谢,你能给我举一个使用Java配置的例子吗?它是否仍然使用咖啡因作为潜在的管理者?事实上,我并不在乎我使用哪个impl,我“只是”想要一个可以做到这一点的impl;)也许这些链接中的一个有帮助,来自@Stephane Nicoll的最有用答案最大的错误是什么?这对我来说似乎很管用。。。我将一个bean定义为主bean,然后另一个管理器必须是可缓存的注释,正如您所做的那样..?为了与
@Cacheable
一起使用,我必须使用
CacheManager.registerCustomCache(名称,cache.getNativeCache())手动将它们注册到
CacheManager
检查您的C配置中是否有
@EnableCaching
。不需要手动注册缓存。
    @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();
    }
}

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:

@Data
public class CacheSpec {

    private Integer timeout;
    private Integer max = 200;

}