Spring Webflux连接Azure Redis报错:readAddress(..) failed: Connection reset by peer
1. 修正连接地址的明显错误
看错误日志里的连接地址是hostname.redis.cache.windows.net/:6380,多了一个多余的斜杠。先检查你的配置文件spring.data.redis.host是否末尾带了斜杠,或者代码中redisHostName变量是否被错误拼接了斜杠。Azure Redis的主机名应该是纯域名格式,比如xxx.redis.cache.windows.net,不带任何路径后缀。
2. 细化SSL配置适配Azure Redis要求
Azure Redis强制要求使用TLS 1.2或更高版本,虽然你代码里调用了.useSsl(),但可以明确指定SSL协议版本,避免Lettuce默认使用不兼容的协议:
val clientConfig = LettucePoolingClientConfiguration.builder() // 保留原有其他配置 .useSsl() .sslProtocol(SslProtocol.TLSv1_2) // 指定TLS 1.2协议 .build()
如果是测试环境排查,可临时禁用hostname验证(不推荐生产环境)来排除证书验证问题:
.sslOptions(SslOptions.builder().disablePeerVerification().build())
3. 调整连接池配置降低初始化压力
你当前的连接池配置中maxIdle和minIdle都设为50,接近maxTotal的一半,可能导致初始化时就尝试创建大量连接,触发Azure Redis的连接数配额限制。先简化配置排查:
protected fun buildLettucePoolConfig(): GenericObjectPoolConfig<Any> { val poolConfig = GenericObjectPoolConfig<Any>() poolConfig.maxTotal = 10 poolConfig.maxIdle = 5 poolConfig.minIdle = 2 poolConfig.maxWait = Duration.ofMillis(10000) return poolConfig }
同时去掉手动调用的.afterPropertiesSet(),LettuceConnectionFactory会在Spring初始化流程中自动完成初始化,手动调用可能导致提前创建连接池引发异常。
4. 换用RedisURI方式配置连接
直接用Azure Redis标准URI格式配置,可避免零散配置项遗漏:
@Bean @Primary fun reactiveRedisConnectionFactory(): ReactiveRedisConnectionFactory { // 注意URI前缀是rediss(带s表示SSL) val redisUri = RedisURI.create("rediss://:${redisPassword}@${redisHostName}:${redisPort}") val clientConfig = LettucePoolingClientConfiguration.builder() .commandTimeout(Duration.ofSeconds(60)) .poolConfig(buildLettucePoolConfig()) .build() return LettuceConnectionFactory(redisUri, clientConfig) }
5. 确认应用环境的网络连通性
虽然本地CLI能连接,但要确认Spring Boot应用运行环境的网络是否和CLI一致:
- 如果应用在容器或云服务中,检查网络安全组(NSG)是否允许6380端口的出站流量
- 在应用环境执行
nslookup hostname.redis.cache.windows.net,确认DNS解析到正确的IP - 用
nc -zv hostname.redis.cache.windows.net 6380测试端口连通性
6. 检查版本兼容性
不同Spring Boot版本对应的Lettuce版本可能存在TLS或Azure Redis兼容性问题:
- 确认Spring Boot版本(建议2.7.x及以上)对应的Lettuce版本是否支持TLS 1.2
- 若使用较旧版本,尝试升级Lettuce依赖到最新稳定版
7. 开启Debug日志定位细节
添加日志配置查看连接过程的详细错误:
在application.properties中添加:
logging.level.io.lettuce=DEBUG logging.level.org.springframework.data.redis=DEBUG
通过Debug日志可以看到SSL握手、认证步骤的具体失败环节,帮助定位根因。
内容的提问来源于stack exchange,提问作者Sachin

