填错 spring.redis.host 或 port 会导致连接拒绝而非超时,90% 是因 host 错填为 localhost;port 需与 redis.conf 一致;bind 限制、password、database、timeout 和连接池参数配置不当均引发各类连接或命令异常。

spring.redis.host 和 port 填错会导致连接拒绝,不是超时
直接连不上 Redis 时,90% 是因为 spring.redis.host 写成了 localhost 或 127.0.0.1,而 Redis 实例其实在另一台机器上。Spring Boot 默认用本地回环地址,但生产环境几乎从不这么部署。
-
spring.redis.host必须填实际服务端 IP(如192.168.1.101),不能依赖 DNS 别名或容器 hostname(除非明确配置了 /etc/hosts) -
spring.redis.port默认是6379,但很多私有云或安全加固环境会改端口,比如6380、7001(集群节点)甚至非标准端口,务必和redis.conf中的port一致 - 如果 Redis 启用了
bind限制(如只绑127.0.0.1),即使 IP 填对了,也会被内核丢包——得去服务端检查bind和protected-mode
password 和 database 配置错位会报 AUTH failed 或 NOAUTH 错误
密码没配或配错,常见报错是 NOAUTH Authentication required;但更隐蔽的是 database 被忽略,导致数据写进 DB0,而业务代码却在读 DB1——查不到数据,还以为 Redis 挂了。
-
spring.redis.password为空字符串时,Spring Boot 不会发AUTH命令;但如果 Redis 配了requirepass,就会直接拒绝连接 -
spring.redis.database默认是0,但有些中间件(如 Spring Session)默认用 DB1,不统一就会串库 - Redis 的 database 索引范围是
0到databases-1(默认16),填16会报ERR invalid DB index
timeout 设太小会让短时网络抖动直接炸掉整个请求链
spring.redis.timeout 控制的是单次命令(如 GET、SET)的 Socket 读写超时,不是连接建立超时。设成 100ms 看似快,但在高负载 Redis 或跨机房场景下,很容易触发 RedisCommandTimeoutException,且无法重试。
- 建议值:局域网内
2000ms(2秒),跨可用区或混合云至少5000ms - 它和连接池的
max-wait(获取连接等待时间)是两回事:前者是命令执行超时,后者是拿不到连接时卡多久 - 别把
timeout和redis.conf中的timeout 300混淆——那是服务端主动断开空闲连接的秒级设置,不影响客户端命令超时
Lettuce 连接池参数不调,QPS 上千就容易耗尽连接
默认连接池(Lettuce)是懒初始化、无上限的,压测时看着 QPS 很高,其实大量线程在等连接,最终表现为接口毛刺、RT 飙升、部分请求失败。
-
lettuce.pool.max-active: 200是硬上限,按「峰值 QPS × 平均响应时间(秒)」粗略估算,比如 1000 QPS × 0.2s = 200,就得设到 200+,留 20% 余量 -
min-idle设太低(如 0)会导致突发流量来时频繁建连,增加 TLS 握手或认证开销;建议设为max-active的 10%~20% -
test-while-idle: true必开,否则空闲连接可能被服务端悄悄断开(尤其经过 NAT 或 LB),取出来直接报Connection closed

















