0

我们正在使用咖啡因来替换当前 springboot 中默认的 ConcurrentHashMap 缓存。我们正在使用@Cacheable(cacheNames = { "..." })注解动态创建缓存。

我正在尝试设置recordStats属性,因为我们正在使用 springboot 执行器包来监控我们应用程序的各个方面。

我尝试设置spring.cache.caffeine.spec=expireAfterAccess=3600s,recordStatsapplication.properties但不起作用。

在课堂上设置它@Configure也不起作用:

@Configuration
public class CacheConfig {

  @Bean
  public CacheManager cacheManager() {
    CaffeineCacheManager cacheManager = new CaffeineCacheManager();
    cacheManager.setCacheSpecification("expireAfterAccess=3600s,recordStats");
    return cacheManager;
  }
}

缓存统计信息不会出现在/actuator/cache/{caches}端点或我们的 springboot-admin 服务器中。

从当前的 api 文档中,我发现:

字符串语法是一系列以逗号分隔的键或键值对,每个对应于一个 Caffeine 构建器方法。

initialCapacity=[integer]: sets Caffeine.initialCapacity.

...

recordStats: sets Caffeine.recordStats(). 

持续时间由一个整数表示,后跟“d”、“h”、“m”或“s”之一,分别表示天、小时、分钟或秒。当前没有以毫秒、微秒或纳秒为单位请求过期的语法。

逗号和等号前后的空格将被忽略。键不能重复;在单个值中使用以下键对也是非法的:

maximumSize and maximumWeight
weakValues and softValues 

以及相关点:

CaffeineSpec 不支持使用非值参数配置 Caffeine 方法。这些必须在代码中配置。

有没有可能完成我的任务?

谢谢

4

2 回答 2

8

您可以手动为缓存定义 bean,例如

@Bean
public Cache recorded() {
    return new CaffeineCache("recorded", Caffeine.newBuilder()
            .recordStats()
            .build());
}

这个 bean 将被 Spring Boot 拾取,您将能够@Cacheable("recorded")在您的代码中使用(注意匹配的缓存名称)。

我的 Caffeine 和 Spring Boot 宠物项目也可能对您有用: https ://github.com/stepio/coffee-boots

这个确切的recordStats()设置功能没有在那里测试,但总是感谢错误报告和 PR。

PS:相关问题: 动态切换 Caffeine Cache 上的记录统计信息

干杯!

于 2020-02-04T00:40:31.960 回答
3

我设法让它工作。这是代码:

@Configuration
public class CacheConfig {

  @Bean
  public CacheManager cacheManager() {
    CaffeineCacheManager cacheManager = new CaffeineCacheManager("cache1",
        "cache2", "cache3");
    cacheManager.setCacheSpecification("recordStats");
    return cacheManager;
  }
}

仍然有缺点,缓存名称必须与@Cacheable(cachenames={"..."})注释中的名称匹配

于 2020-02-04T11:42:08.127 回答