<p>Spring Boot 3.x 默认使用 spring.data.redis. 配置前缀和 Lettuce 客户端,若仍用 spring.redis. 前缀、缺失 spring.data.redis.password、未正确配置 lettuce.pool 参数或未排除 RedisAutoConfiguration,则会导致 redisConnectionFactory 创建失败及序列化乱码等问题。</p>

Spring Boot 3.x 默认开箱即用 Redis,只要加依赖、配参数,RedisAutoConfiguration 就会自动装配好 RedisConnectionFactory 和 RedisTemplate —— 但默认序列化和连接池配置不适用于生产,直接用容易踩坑。
为什么加了 starter 却报 Cannot resolve reference to bean 'redisConnectionFactory'
这是最常遇到的启动失败现象,根本原因不是没加依赖,而是配置缺失或冲突:
-
spring-data-redis和lettuce-core必须同时存在(Spring Boot 3.x 默认用 Lettuce,不再支持 Jedis 自动装配) - 如果只写
spring.redis.host,漏掉spring.data.redis.host—— Spring Boot 3.x 的配置前缀已统一为spring.data.redis.*,旧的spring.redis.*前缀在 3.x 中已被废弃 - 使用了密码但没配
spring.data.redis.password,或密码含特殊字符(如@、/)未做 URL 编码,导致连接 URI 解析失败 - 启用了
@EnableCaching但没配spring.cache.type=redis,此时 Spring 会尝试初始化缓存相关 Bean,而RedisCacheConfiguration依赖RedisConnectionFactory,形成隐式强依赖
RedisTemplate 存字符串却变成乱码或二进制,怎么 fix
因为 Spring Boot 3.x 默认的 RedisTemplate<object object></object> 使用 JdkSerializationRedisSerializer 序列化所有值,包括 String —— 这会导致可读性差、跨语言不兼容、内存占用翻倍。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 必须显式定义
RedisTemplate<string string></string>Bean,并设置StringRedisSerializer给 key 和 value - 若需存 JSON 对象(比如
User),建议单独定义一个RedisTemplate<string user></string>,value 用Jackson2JsonRedisSerializer,避免泛型擦除导致反序列化失败 - 不要试图复用同一个
RedisTemplate处理多种类型数据:key 是 String、value 是 String / Integer / User 混用,会导致序列化器冲突或运行时ClassCastException - 注意
Jackson2JsonRedisSerializer默认不开启DefaultTyping,若存的是多态对象(如List<Object>),需手动配置ObjectMapper启用类型信息,否则反序列化会丢失具体类型
连接池参数不起作用?检查 lettuce.pool 配置层级
Spring Boot 3.x 中 Lettuce 连接池配置必须严格落在 spring.data.redis.lettuce.pool 下,且参数名与 Lettuce 原生参数一一对应。常见错配:
- 写成
spring.redis.lettuce.pool.max-active→ 错,前缀必须是spring.data.redis - 写成
spring.data.redis.lettuce.pool.maxActive(驼峰)→ 错,YAML 只认 kebab-case:max-active - 设了
max-wait: -1却没加单位(如ms),Spring Boot 3.x 会解析失败并静默回退到默认值(Lettuce 默认无限等待,但日志里不会提示) -
min-idle: 0是安全的,但设为1并不能保证连接池始终保活一个连接 —— Lettuce 的 idle 管理逻辑不同于 Apache Commons Pool,它不主动维持最小空闲数
想自定义 starter 封装 Redis 配置?绕过 RedisAutoConfiguration 的关键点
如果你要写自己的 my-redis-starter,核心不是“重写配置”,而是“接管条件装配”:
- 在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3.x 新机制)中,**必须排除**org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,否则你的配置类和官方的会冲突 - 自定义
@ConfigurationProperties类(如MyRedisProperties)的 prefix 别用spring.data.redis,否则会被 Spring Boot 的绑定机制抢先处理,导致你的@Bean拿不到正确参数 - 不要在 starter 里直接
@Import(LettuceConnectionConfiguration.class)—— 它内部依赖RedisProperties,而你已经换了 prefix,会导致RedisConnectionFactory创建失败 - 真正该做的,是复制
LettuceClientConfigurationBuilderCustomizer的逻辑,在自己的配置类里构造ClientResources和LettuceClientConfiguration,再传给LettuceConnectionFactory构造函数
复杂点在于:Spring Boot 3.x 的自动配置链更严格,任何配置路径、属性名、类加载顺序的偏差都会导致整个 Redis 初始化中断,且错误日志往往只显示顶层 Bean 创建失败,不会告诉你到底是哪个 @Conditional 不满足。调试时优先看 DEBUG 级日志中 o.s.b.a.d.r.RedisAutoConfiguration 和 o.s.b.a.d.r.LettuceConnectionConfiguration 的匹配结果。

















