查不到token的根源是测试与生产环境redis数据库索引不一致:测试用默认database 0,生产配置了database 4但查询时仍连0库,导致数据“存对库、查错库”。

本地测试正常、生产报错,八成是环境配置没对齐,不是代码问题,也不是Redis服务挂了。
检查 application-prod.yml 里是否漏配或错配 spring.redis.database
测试环境常默认用 0 号库,而生产配置里可能写了 database: 4,但你查数据时还在 0 库翻找——自然查不到。这不是 Redis 没存,是存到了“另一个房间”。
- 用
redis-cli -h {host} -p {port} -a {password}连上生产 Redis 后,先执行SELECT 4(把 4 换成你配置的 database 值),再KEYS *看有没有 Token 键 - 确认
application-test.yml和application-prod.yml中spring.redis.database是否显式声明;没写就是默认 0,写了就得按写的值去查 - 如果多个微服务共用一个 Redis 实例,不同环境必须用不同
database或加统一前缀,否则互相覆盖/干扰
验证 spring.redis.host 和 spring.redis.port 是不是指向了“假地址”
开发机上 host: 127.0.0.1 能通,不代表生产服务器能访问同个地址。常见错误是直接复制本地配置,忘了改 IP 或端口。
- 在生产服务器上手动执行
telnet 192.168.1.100 6379(把 IP 和端口换成你配置的值),看是否连得通;不通就说明网络隔离或防火墙挡住了 - 检查 Redis 服务端的
bind配置:若只绑定了127.0.0.1,外部机器无法连接;需改为0.0.0.0或具体内网 IP,并确保protected-mode no - 云服务器(如阿里云、腾讯云)还要检查安全组规则,6379 端口是否对 Spring Boot 所在机器的内网 IP 开放
排查 spring.redis.password 是否被 YAML 解析器吃掉空格或特殊字符
密码含 #、:、{、[ 或开头结尾有空格时,YAML 会误解析,导致实际传给 Lettuce 的密码为空或截断。
- 把密码用单引号包起来:
password: 'test_redis_123#v2',避免被当作注释或结构分隔符 - 检查配置文件缩进是否全为英文空格(不能混用 Tab),YAML 对缩进极其敏感
- 启动日志里搜
redis.password,看 Spring Boot 是否成功读取到该值(有些版本会在 INFO 日志打印脱敏后的 password,可辅助判断)
真正容易被忽略的是:database 不一致不会报连接异常,只会静默写入/读取错库;而网络不通或密码错,通常会抛 RedisConnectionFailureException 或 AuthenticationException。所以看到“查不到数据”却没报错,第一反应不该是查代码逻辑,而是打开两个配置文件并排 diff —— 尤其是那几行看似不起眼的 database、host、password。











