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

Spring Boot连接Redis遇MasterReplicaTopologyRefresh错误,如何修改默认地址端口?

Spring Boot连接Redis时MasterReplicaTopologyRefresh错误的解决办法

出现这个问题,大概率是Redis客户端(比如Lettuce)开启了自动拓扑刷新,但Redis实例返回的拓扑信息里带了容器内部IP(比如你遇到的172.21.0.3),导致客户端反复尝试连接这个无法访问的地址。下面给几个解决办法:

1. 直接禁用自动拓扑刷新

如果你的Redis是单实例,或者不需要自动发现集群拓扑,直接关掉这个功能就行。

在application.properties里加配置:

# 集群模式禁用刷新
spring.data.redis.lettuce.cluster.refresh.enabled=false
# 哨兵模式的话用这个
spring.data.redis.sentinel.refresh.enabled=false

或者application.yml:

spring:
  data:
    redis:
      lettuce:
        cluster:
          refresh:
            enabled: false
      # 哨兵模式配置
      sentinel:
        refresh:
          enabled: false

2. 保留拓扑刷新但替换节点地址

如果必须用拓扑刷新(比如Redis集群场景),可以自定义客户端配置,强制用你指定的节点地址,不让客户端自动发现错误IP。

创建一个Redis配置类:

import io.lettuce.core.resource.ClientResources;
import io.lettuce.core.resource.DefaultClientResources;
import io.lettuce.core.topology.DefaultTopologyRefreshOptions;
import io.lettuce.core.topology.TopologyRefreshOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;

@Configuration
public class RedisConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        // 关闭动态刷新源,用配置的固定地址
        TopologyRefreshOptions topologyRefreshOptions = DefaultTopologyRefreshOptions.builder()
                .dynamicRefreshSources(false)
                .build();

        ClientResources clientResources = DefaultClientResources.builder()
                .topologyRefreshOptions(topologyRefreshOptions)
                .build();

        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .clientResources(clientResources)
                .build();

        // 替换成你的Redis实际主机和端口
        return new LettuceConnectionFactory("your-redis-host", 6379, clientConfig);
    }
}

要是是集群模式,也可以直接配置静态集群节点,关闭自动刷新:

spring.data.redis.cluster.nodes=你的节点1:6379,你的节点2:6379
spring.data.redis.lettuce.cluster.refresh.enabled=false

3. 修改Redis实例的绑定配置

从根源解决的话,让Redis绑定可外部访问的IP,而不是仅容器内部IP。修改Redis的redis.conf:

bind 0.0.0.0  # 允许所有IP访问
protected-mode no  # 测试环境可以关,生产环境建议用密码认证代替

重启Redis后,它返回的拓扑信息里就会是正确的可访问IP了。

内容的提问来源于stack exchange,提问作者Hadi Abou Hamzeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:35:10