Spring Boot自定义CacheManager Bean后Redis缓存配置失效问题
Spring Boot同时使用自定义CacheManager与Redis缓存配置的解决方案
当你自定义CacheManager Bean后,Spring Boot的自动配置机制会判定你要完全接管缓存管理逻辑,因此不会再根据application.yaml中的Redis缓存配置自动创建RedisCacheManager,这就是Redis配置被忽略的核心原因。以下是两种可行的解决思路:
方案1:注册双CacheManager Bean,通过命名区分使用
分别创建自定义的ConcurrentMapCacheManager和基于Redis配置的RedisCacheManager,并给它们指定唯一Bean名称,可通过@Primary标记默认缓存管理器,使用缓存时通过cacheManager参数明确选择实例。
代码实现
- 自定义ConcurrentMapCacheManager并命名
@Bean("concurrentMapCacheManager") public CacheManager concurrentMapCacheManager() { return new ConcurrentMapCacheManager(LDAP_CACHE_NAME) { @Override protected Cache createConcurrentMapCache(final String name) { return new ConcurrentMapCache(name, CacheBuilder.newBuilder() .expireAfterWrite(30, TimeUnit.SECONDS) .maximumSize(100) .build().asMap(), false); } }; }
- 手动构建RedisCacheManager,复用Redis连接配置
@Bean("redisCacheManager") @Primary // 可选,标记为默认缓存管理器 public CacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); // 映射application.yaml中的cache-specs配置 Map<String, RedisCacheConfiguration> cacheConfigs = new HashMap<>(); cacheConfigs.put("myCustomCache", defaultCacheConfig.entryTtl(Duration.ofSeconds(600))); return RedisCacheManager.builder(redisConnectionFactory) .cacheDefaults(defaultCacheConfig) .withInitialCacheConfigurations(cacheConfigs) .build(); }
- 使用时指定对应缓存管理器
// 使用自定义ConcurrentMap缓存 @Cacheable(value = LDAP_CACHE_NAME, cacheManager = "concurrentMapCacheManager") public User getLdapUser(String userId) { // 业务逻辑实现 } // 使用Redis缓存 @Cacheable(value = "myCustomCache", cacheManager = "redisCacheManager") public Product getProduct(String productId) { // 业务逻辑实现 }
方案2:保留Redis自动配置,扩展自定义缓存管理器
移除自定义的全局CacheManager Bean,通过CacheManagerCustomizer调整Redis缓存配置,同时单独注册ConcurrentMapCacheManager Bean。
代码实现
@Bean("concurrentMapCacheManager") public CacheManager concurrentMapCacheManager() { return new ConcurrentMapCacheManager(LDAP_CACHE_NAME) { @Override protected Cache createConcurrentMapCache(final String name) { return new ConcurrentMapCache(name, CacheBuilder.newBuilder() .expireAfterWrite(30, TimeUnit.SECONDS) .maximumSize(100) .build().asMap(), false); } }; } // 自定义RedisCacheManager的配置逻辑 @Bean public CacheManagerCustomizer<RedisCacheManager> redisCacheManagerCustomizer() { return manager -> { RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig(); manager.setCacheDefaults(defaultConfig); // 对应application.yaml中的myCustomCache过期配置 manager.getCacheConfigurations().put("myCustomCache", defaultConfig.entryTtl(Duration.ofSeconds(600))); }; }
注意事项
- 存在多个CacheManager Bean时,必须通过
cacheManager参数指定实例,或用@Primary标记默认Bean,否则Spring会抛出找不到唯一缓存管理器的异常。 - 手动构建RedisCacheManager时,务必注入
RedisConnectionFactory,这样才能复用application.yaml中配置的Redis连接信息(如host、端口等)。
内容的提问来源于stack exchange,提问作者Pavel Hora
相关产品推荐
相关产品推荐

