Spring Boot自动配置仅支持一套spring.redis.*,因RedisAutoConfiguration默认只创建一个RedisConnectionFactory Bean;多套同前缀配置会引发BeanDefinitionOverrideException或覆盖冲突,必须手动定义多个命名ConnectionFactory并禁用默认自动配置。

为什么不能直接用 spring.redis.* 配置多个 Redis 实例
Spring Boot 的自动配置只支持一套 spring.redis.* 配置,RedisAutoConfiguration 默认只创建一个 RedisConnectionFactory Bean。硬塞多套配置会触发 BeanDefinitionOverrideException 或覆盖前一个实例,最终所有 @Autowired 注入的都是同一个连接工厂。
真正要隔离数据源,必须手动定义多个 RedisConnectionFactory Bean,并显式指定名称,避免自动配置干扰。
- 关闭默认 Redis 自动配置:
@SpringBootApplication(exclude = {RedisAutoConfiguration.class}) - 每个连接工厂需绑定独立的
RedisStandaloneConfiguration或RedisSentinelConfiguration - 务必为每个 Bean 设置唯一
@Primary(仅一个)或通过@Qualifier显式引用
如何定义两个命名的 RedisConnectionFactory Bean
以两个独立的单机 Redis 为例(端口分别为 6379 和 6380),关键在构造时传入不同配置,并用 @Bean 指定名称:
@Configuration
public class RedisMultiConfig {
<pre class="brush:php;toolbar:false;">@Bean("redisMasterConnectionFactory")
public RedisConnectionFactory redisMasterConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost", 6379);
return new LettuceConnectionFactory(config);
}
@Bean("redisSlaveConnectionFactory")
public RedisConnectionFactory redisSlaveConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost", 6380);
return new LettuceConnectionFactory(config);
}}
注意:LettuceConnectionFactory 是 Spring Data Redis 2.0+ 推荐的实现(替代已弃用的 JedisConnectionFactory);若需连接池控制,可额外设置 ClientOptions 和 ClientResources。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
怎样让 RedisTemplate 绑定到指定连接工厂
每个 RedisTemplate 必须明确关联一个 RedisConnectionFactory,否则会因依赖注入歧义启动失败。不能靠类型匹配,必须用 @Qualifier 指定 Bean 名:
@Bean("masterRedisTemplate")
public RedisTemplate<string object> masterRedisTemplate(
@Qualifier("redisMasterConnectionFactory") RedisConnectionFactory factory) {
RedisTemplate<string object> template = new RedisTemplate();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
<p>@Bean("slaveRedisTemplate")
public RedisTemplate<string object> slaveRedisTemplate(
@Qualifier("redisSlaveConnectionFactory") RedisConnectionFactory factory) {
RedisTemplate<string object> template = new RedisTemplate();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}</string></string></p></string></string>
常见错误:漏写 @Qualifier,导致 Spring 尝试按类型注入多个 RedisConnectionFactory,抛出 NoUniqueBeanDefinitionException。
使用时如何避免混淆和线程安全问题
多数据源不等于多线程安全——RedisConnectionFactory 和 RedisTemplate 本身是线程安全的,但业务逻辑中若混用模板,容易写错目标库。建议:
- 在 Service 层按职责注入对应模板:
@Qualifier("masterRedisTemplate")用于写,@Qualifier("slaveRedisTemplate")用于读 - 避免在同一个方法里交替调用两个模板,尤其涉及事务性操作(Redis 本身无跨实例事务)
- 如果使用
StringRedisTemplate,同样需分别定义并标注@Qualifier,不要复用RedisTemplate的序列化配置 - Lettuce 默认启用连接池,但若高并发下出现
UnableToConnectException,需检查GenericObjectPoolConfig中的maxTotal和minIdle
最易被忽略的一点:自定义配置类若被多个 @ComponentScan 扫描到,可能重复注册 Bean——确保该配置类只被加载一次,必要时加 @ConditionalOnMissingBean 防御。










