You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数明确选择实例。

代码实现

  1. 自定义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);
        }
    };
}
  1. 手动构建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();
}
  1. 使用时指定对应缓存管理器
// 使用自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:15:15