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

如何获取Spring自动生成的RedisCacheConfiguration并扩展配置?

解决方案:基于Spring Boot配置文件扩展RedisCacheConfiguration

你的需求完全可行,不需要放弃application.properties中的spring.cache.redis.*配置,可以通过以下两种方式基于自动配置的缓存设置进行扩展:

为什么之前的方法失效

  • 直接通过@Bean创建RedisCacheConfiguration时,RedisCacheConfiguration.defaultCacheConfig()是从头构建的空配置,不会读取spring.cache.redis.*的属性,因此会覆盖自动配置的设置。
  • 无法直接注入RedisCacheConfiguration是因为Spring Boot自动配置中,该实例并非作为独立Bean注册,而是在构建RedisCacheManager的过程中内部生成的,容器中不存在可直接注入的该Bean实例。

方法一:使用RedisCacheManagerBuilderCustomizer(推荐)

这个接口允许你在自动配置构建RedisCacheManager的阶段,获取已经加载了配置文件属性的默认RedisCacheConfiguration,再对其进行自定义修改:

import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
        return builder -> {
            // 获取自动配置加载好的默认缓存配置
            RedisCacheConfiguration defaultConfig = builder.getCacheConfiguration();
            
            // 在原有配置基础上添加自定义设置,比如更换值序列化器
            RedisCacheConfiguration customizedConfig = defaultConfig
                    .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
            
            // 将修改后的配置设为默认
            builder.cacheDefaults(customizedConfig);
            
            // 也可以为特定缓存名单独配置(比如"userCache"缓存设置2小时过期)
            builder.withCacheConfiguration("userCache", customizedConfig.entryTtl(java.time.Duration.ofHours(2)));
        };
    }
}

方法二:基于RedisCacheProperties构建配置

通过注入RedisCacheProperties(自动绑定spring.cache.redis.*属性的类),基于它构建RedisCacheConfiguration,既保留配置文件设置,又能添加自定义逻辑:

import org.springframework.boot.autoconfigure.cache.RedisCacheProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(RedisCacheProperties properties) {
        // 基于配置文件属性初始化基础缓存配置
        RedisCacheConfiguration config = properties.initializeConfiguration(RedisCacheConfiguration.defaultCacheConfig());
        
        // 添加自定义配置,比如修改序列化规则
        return config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
    }
}

以上两种方法都能保留application.properties中的缓存配置,同时实现自定义扩展,无需完全通过代码重写所有配置。

内容的提问来源于stack exchange,提问作者Fábio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:24:28