gpt4 book ai didi

java - 如何扩展默认的 Spring Boot CacheManager 配置

转载 作者:搜寻专家 更新时间:2023-11-01 03:47:18 25 4
gpt4 key购买 nike

我在我的 Web 应用程序中使用 Spring Boot 缓存支持,我设置了 Caffeine作为缓存提供者。

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

在我的 application.properties 中我有类似的东西:

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

这用于普通缓存。然后我想用自定义参数扩展这个配置。

This post解释了如何通过 @Configuration 类配置缓存,但使用这种方法我完全覆盖了通用配置。

我需要的是这样的:

@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;
}

}

但是声明一个新的 CacheManager bean,“原始”cacheManager 不是 Autowiring 的...

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

最佳答案

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

@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.lopez.j/configuring-multiple-ttl-caches-in-spring-boot-dinamically-75f4aa6809f3寻找灵感

关于java - 如何扩展默认的 Spring Boot CacheManager 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43500863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com