是否可以在春季启动中使用咖啡因为每个缓存设置不同的规格



我有一个简单的冲刺启动应用程序,使用弹簧启动1.5.11.RELEASE,并在应用程序Configuration类上@EnableCaching

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

应用程序属性

spring.cache.type=caffeine
spring.cache.cache-names=cache-a,cache-b
spring.cache.caffeine.spec=maximumSize=100, expireAfterWrite=1d

问题

我的问题很简单,如何为每个缓存指定不同的大小/过期时间。 例如,也许cache-a1 day有效是可以接受的。但cache-b1 week来说可能没问题。咖啡因缓存的规范对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

您可以使用 CaffeineCacheManager 的 registerCustomCache(( 方法,而不是使用 SimpleCacheManager。下面是一个示例:

CaffeineCacheManager manager = new CaffeineCacheManager();
manager.registerCustomCache(
    "Cache1",
    Caffeine.newBuilder()
        .maximumSize(1000)
        .expireAfterAccess(6, TimeUnit.MINUTES)
        .build()
);
manager.registerCustomCache(
    "Cache2",
    Caffeine.newBuilder()
        .maximumSize(2000)
        .expireAfterAccess(12, TimeUnit.MINUTES)
        .build()
);

我像这样配置多个缓存管理器

@Primary
@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:
      

但是,这个类仍然有一个限制,我们只能设置timeoutmax大小。 因为CacheSpec

@Data
public class CacheSpec {
    private Integer timeout;
    private Integer max = 200;
}
因此,如果要添加更多

配置参数,则需要在类CacheSpec上添加更多参数,并在函数AppCacheConfig.buildCache上设置Cache配置。

希望这有帮助!

我将最初的 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 的行为。

最新更新