使用Spring和Caffeine定义多个缓存配置

问题描述

我需要在服务中使用多个缓存以用于不同的用途。 我正在寻找一种方法来分隔其配置,例如 maximumSize expireAfterWrite 。 我正在使用Spring和Kubernetes,在deploy.yaml中,我有这个:

spring:
  main:
    allow-bean-deFinition-overriding: true
  cache:
    type: caffeine
    cache-names: cacheA,cacheB
    caffeine:
      spec: expireAfterWrite=1h,maximumSize=2000
  output:
    ansi:
      enabled: never

我想创建一个新的缓存 cacheC ,它将具有不同的配置。

我该怎么做?谢谢!

解决方法

您可以以编程方式声明许多缓存配置,而不是使用yaml。

类似这样的东西:

@Configuration
@EnableCaching
public class CacheConfig {

    public static final String CACHE_A = "cacheA";
    public static final String CACHE_B = "cacheB";
    public static final String CACHE_C = "cacheC";

    @Bean
    public CacheManager cacheManagerTicker(Ticker ticker) {
       
       List<Cache> caches = new ArrayList<>();
       
       // Cache A
       caches.add(this.buildCache(CACHE_A,ticker,2000L,1L,TimeUnit.HOURS));
       
       // Cache B
       caches.add(this.buildCache(CACHE_B,TimeUnit.HOURS));
       
       // Cache C
       caches.add(this.buildCache(CACHE_C,3500L,15L,TimeUnit.MINUTES));
       
       SimpleCacheManager cacheManager = new SimpleCacheManager();
       cacheManager.setCaches(caches);
       return cacheManager;
    }
    
    private CaffeineCache buildCache(String cacheName,Ticker ticker,Long maxSize,Long ttl,TimeUnit ttlUnit){
    
        Caffeine<Object,Object> cacheBuilder = Caffeine.newBuilder();

        // TTL
        if (ttl != null && ttl > 0 && ttlUnit != null){
            cacheBuilder.expireAfterWrite(ttl,ttlUnit);
        }
        
        // Max size
        if (maxSize != null && maxSize > 0){
            cacheBuilder.maximumSize(maxSize);
        }
        
        // Ticker
        cacheBuilder.ticker(ticker);
        
        return new CaffeineCache(cacheName,cacheBuilder.build());
    }
    
    @Bean
    public Ticker ticker() {
        return Ticker.systemTicker();
    }
    
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...