dav*_*ooh 5 java spring spring-boot caffeine
我在我的 Web 应用程序中使用 Spring Boot 缓存支持,并将Caffeine设置为缓存提供程序。
我的项目中有几个缓存,大多数都有通用的配置,但是对于两个特定的缓存我需要设置不同的参数。
在我的application.properties我有类似的东西:
spring.cache.cache-names=a-cache,b-cache,c-cache, ...
spring.cache.caffeine.spec=maximumSize=200,expireAfterWrite=3600s
Run Code Online (Sandbox Code Playgroud)
这适用于常见的缓存。然后我想用自定义参数扩展这个配置。
这篇文章解释了如何通过@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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是声明一个新的CacheManagerbean,“原始”cacheManager不是自动装配的......
有没有办法实现我需要的?
我使用 CompositeCacheManager 来处理这种情况。本质上,我创建了自定义配置的 CaffeineCache 并将它们放入 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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3462 次 |
| 最近记录: |