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

如何扩展默认的Spring Boot缓存管理器配置

韩麒
2023-03-14

我在我的web应用程序中使用Spring启动缓存支持,并将咖啡因设置为缓存提供程序。

我在我的项目中有几个缓存,其中大多数都有公共配置,但是对于两个特定的缓存,我需要设置不同的参数。

在我的application.properties中,我有类似的内容:

spring.cache.cache-names=a-cache,b-cache,c-cache, ...
spring.cache.caffeine.spec=maximumSize=200,expireAfterWrite=3600s

这是常见的缓存。然后我想使用自定义参数扩展此配置。

这篇文章解释了如何通过配置类配置缓存,但是使用这个方法我完全覆盖了常见的配置。

我需要的是这样的东西:

@Configuration
public class CacheConfiguration {

    @Autowired
    private CacheManager cacheManager;

    @Bean
    public CacheManager cacheManager(Ticker ticker) {
        CaffeineCache c1 = new CaffeineCache("my-custom-cache", Caffeine.newBuilder()
                       .expireAfterWrite(10, TimeUnit.MINUTES)
                       .maximumSize(400)
                       .build());

        // ...

        cacheManager.setCaches(Arrays.asList(..., c1, ... )); // here I'd like to add custom caches...
        return cacheManager;
    }

}

但是声明一个新的CacheManagerbean,“原始的”CacheManager不是自动连接的。。。

有没有办法实现我需要的?

共有1个答案

公冶鸣
2023-03-14

我使用CompositeChemaManager来处理这种情况。基本上,我创建自定义配置的CaffineCache,并将它们放在SimpleCacheManager中,然后使用带有默认设置的CaffineCacheManager。我将两个html" target="_blank">缓存管理器都放入CompositeCacheManager中,spring将首先在我的SimpleCacheManager中查找匹配的缓存,如果没有找到,它将在CaffeineCacheManager中查找。如果CaffineCacheManager也没有匹配项,它将使用默认设置创建一个新缓存。

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {

  private static final Logger logger = LoggerFactory.getLogger(CacheConfig.class);

  @Autowired
  private MyCacheProperties myCacheProperties;

  @Bean
  @Override
  public CacheManager cacheManager() {
    // create a custom configured cache for each of the customCacheSpecs in the myCacheProperties
    final List<CaffeineCache> customCaches = myCacheProperties.getCustomCacheSpecs().entrySet().stream()
        .map(entry -> buildCache(entry.getKey(), entry.getValue()))
        .collect(Collectors.toList());
    // put the custom caches in a SimpleCacheManager
    final SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
    simpleCacheManager.setCaches(customCaches);

    // create a Caffeine Cache manager based on the defaultCacheSpec in the myCacheProperties
    final CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
    caffeineCacheManager.setCacheSpecification(myCacheProperties.getDefaultCacheSpec());
    caffeineCacheManager.setAllowNullValues(false);

    // create a CompositeCacheManager which will first look for a customized cache from the simpleCacheManager and then
    // if no cache is found it will delegate to the caffeineCacheManager.  If the caffeineCacheManager already has
    // created an appropriate cache it will be used, other wise it will create a new cache with the default
    // settings
    final CompositeCacheManager compositeCacheManager = new CompositeCacheManager(simpleCacheManager,
        caffeineCacheManager);
    return compositeCacheManager;
  }

  private CaffeineCache buildCache(final String name, final String cacheSpec) {
    final CaffeineCache caffeineCache = new CaffeineCache(name, Caffeine.from(cacheSpec)
        .build());
    logger.debug("created custom cache: name='{}', and spec='{}'", name, cacheSpec);
    return caffeineCache;
  }
}

幸亏https://medium.com/@d、 洛佩兹。j/configuration-multiple-ttl-caches-in-spring-boot-dinamically-75f4aa6809f3的灵感

 类似资料:
  • 我使用@enableCaching和@cacheable注释在SpringBoot应用程序中启用了缓存。缓存属性在application.yaml文件中定义。

  • 我在SpringBootApplication中实现了缓存,如下所示 那么,如果我们不定义CacheManager将使用什么呢?

  • 扩展说明 用请求参数作为 key,缓存返回结果。 扩展接口 org.apache.dubbo.cache.CacheFactory 扩展配置 <dubbo:service cache="lru" /> <!-- 方法级缓存 --> <dubbo:service><dubbo:method cache="lru" /></dubbo:service> <!-- 缺省值设置,当<dubbo:serv

  • 问题内容: Hibernate使用的默认缓存的名称是什么?甚至有默认的缓存,还是必须添加缓存提供程序才能利用缓存? 我以为是EHCache,但我认为必须对其进行配置…默认情况下它不是“那里” … 问题答案: Hibernate已经通过持久上下文提供了一种称为 一级缓存 的缓存机制。它在 Session作用域内,默认情况下处于启用状态,无法关闭。 诸如EHCache之类的缓存提供程序提供了另一种称为

  • 你可以通过 nuxt.config.js 文件中的 extend 配置项来扩展 Webpack 的配置: module.exports = { build: { extend (config, { isDev, isClient }) { // ... } } }

  • 我正在使用带有Spring Boot(2.3.3版)的H2数据库和H2数据库的所有默认设置。 这是我申请的所有文件。 pom.xml