首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在spring boot中使用caffeine为每个缓存设置不同的规格?

是否可以在spring boot中使用caffeine为每个缓存设置不同的规格?
EN

Stack Overflow用户
提问于 2018-04-18 02:27:40
回答 3查看 13.3K关注 0票数 30

我有一个简单的sprint启动应用程序,它在应用程序Configuration类中使用了spring boot 1.5.11.RELEASE@EnableCaching

pom.xml

代码语言:javascript
复制
 <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>

application.properties

代码语言:javascript
复制
spring.cache.type=caffeine
spring.cache.cache-names=cache-a,cache-b
spring.cache.caffeine.spec=maximumSize=100, expireAfterWrite=1d

问题

我的问题很简单,如何为每个缓存指定不同的大小/过期时间。例如,对于1 day来说,cache-a是有效的也许是可以接受的。但是对于1 week来说,cache-b可能是可以的。对于CacheManager而不是Cache,咖啡因缓存的规范似乎是全局的。我是不是遗漏了什么?也许有一个更适合我的用例的提供者?

EN

回答 3

Stack Overflow用户

发布于 2019-02-07 18:16:19

这是你唯一的机会:

代码语言:javascript
复制
@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中。

票数 21
EN

Stack Overflow用户

发布于 2020-04-08 16:09:50

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

代码语言:javascript
复制
    @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;
    }

并正常使用缓存

代码语言:javascript
复制
    @Cacheable(cacheManager = "template")
    @Override
    public ArrayList<FmdModel> getData(String arg) {
        return ....;
    }

更新

看起来上面的代码有一个很大的错误。所以我改成了

代码语言:javascript
复制
@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文件中定义缓存规范

代码语言:javascript
复制
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

代码语言:javascript
复制
@Data
public class CacheSpec {

    private Integer timeout;
    private Integer max = 200;

}

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

希望这对你有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2019-07-04 04:36:55

我将我的initial PR转换成了一个单独的tiny project

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

代码语言:javascript
复制
<dependency>
    <groupId>io.github.stepio.coffee-boots</groupId>
    <artifactId>coffee-boots</artifactId>
    <version>2.0.0</version>
</dependency>

属性的格式如下:

代码语言:javascript
复制
coffee-boots.cache.spec.myCache=maximumSize=100000,expireAfterWrite=1m

如果没有定义特定的配置,CacheManager将默认使用Spring的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49885064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档