当前位置: 首页 > 知识库问答 >
问题:

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

丌官子安
2023-03-14

我需要在我的服务中使用多个缓存以实现不同的用途。我正在寻找一种方法来分离它们的配置,如maximumSize和expireAfterWrite。我在部署中使用Spring和Kubernetes。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,它将有不同的配置。

我怎么能那样做?谢谢!

共有1个答案

程举
2023-03-14

您可以通过编程方式声明许多缓存配置,而不是使用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, ticker, 2000L, 1L, TimeUnit.HOURS));
       
       // Cache C
       caches.add(this.buildCache(CACHE_C, ticker, 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();
    }
    
}
 类似资料:
  • 我使用Spring缓存抽象,定义了多个缓存。有时,当数据更改时,我想逐出多个缓存。是否可以使用Spring的CacheExit注释逐出多个缓存?

  • 我在Tomcat中部署了多个Web应用程序,并在TOMCAT_HOME/lib/exts中共享service jar。所有的应用程序都使用Spring,在服务罐中我有bean,用Spring 3.1缓存注释注释。我使用Ehache提供商。我想有一个单一的CacheManager使用的所有Web应用程序。如果我在Web应用程序级别定义Spring缓存配置,缓存工作,但为每个应用程序/上下文创建单独的

  • 自定义缓存类使用说明 phpGrace 1.2.1 版本新增了自定义缓存类的功能,您可以将某个相同类型的缓存封装为一个类文件,便于项目的复用 (: 实现步骤 在 phpGrace/caches/ 文件夹下创建您的自定义缓存类文件 文件命名规则 : 缓存类名称.php 类命名规则 : class 缓存类名称 extends \cacheBase{} 使用命名空间 : namespace phpG

  • 我有一个测试套件,试图用IgniteCache替换ConcurrentHashMap DS。 我用相同的数据结构创建了一个IgniteCache和一个CacheConfiguration,我希望我的新IgniteCache是这样的。在运行时,它从开始到停止。在调试中,它表明在iGnite.GetOrCreateCache(cfg)上;步骤它抛出NullPointerException ;

  • 我对spring boot中的缓存技术很陌生,我在我的项目中使用了缓存。现在我有一个新的需求,需要设置缓存TTL,并且TTL必须在密钥基础上扩展。 E、 g.如果我将缓存过期时间设置为5分钟,则在缓存过期之前,必须检查传入密钥是否存在于缓存中。如果传入密钥存在于缓存中,则TTL必须延长5分钟,否则应清除或收回缓存,并创建新的缓存。 我希望我清楚我的要求,请提供我的解决方案与完美的例子,适合我的要求

  • 我正在向spring启动项目添加缓存。应用程序。yml包含 @EnableCaching位于主应用程序上,我已将@Cacheable(“cacheName”)添加到该方法中,同一类中的另一个方法不会调用它。 在测试中,我看到缓存是NoOp类型的,而不是咖啡因。我已确保在所有情况下都使用正确的导入(springframework)。我还应该在哪里启用缓存?