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
相关产品推荐
相关产品推荐

