错误日志出现 Connection refused [tcp://redis:6379],前后台同时 500。不要先删除 Redis 数据目录;拒绝连接只说明目标地址当前没有接受 TCP 连接,原因可能是服务退出、地址写错、防火墙或容器网络变化。

确认 Magento 实际连接哪个 Redis

grep -n "redis|cache|session|page_cache" app/etc/env.php
getent hosts redis
nc -vz redis 6379
redis-cli -h redis -p 6379 ping

输出配置时必须隐藏密码。缓存、FPC 和 Session 可能使用不同数据库或不同 Redis 主机,要分别确认。

Redis 服务是否存活

systemctl status redis-server
journalctl -u redis-server --since '30 minutes ago'
ss -lntp | grep 6379
redis-cli info server
redis-cli info clients
redis-cli info memory

服务反复重启时,看 OOM、配置语法、磁盘持久化和 maxclients。连接数达到上限通常返回 max number of clients,而不是简单 refused,但负载均衡器健康检查可能会摘除节点。

容器或集群环境检查地址变化

docker ps --filter name=redis
docker logs --tail 100 REDIS_CONTAINER
docker inspect REDIS_CONTAINER --format '{{json .NetworkSettings.Networks}}'

应用应连接稳定的服务名,而不是易变容器 IP。Kubernetes 环境检查 Service endpoints、NetworkPolicy 和 Pod readiness;不要把 Redis 端口临时暴露到公网。

恢复服务后验证三类数据

redis-cli -h redis ping
bin/magento cache:status
bin/magento cache:clean config
curl -skI https://www.example.com/

如果 Session 也在故障 Redis,客户登录和购物车可能失效。恢复缓存不等于 Session 数据已恢复,应测试登录、购物车和后台会话。

能不能临时改用文件或数据库

只有在明确业务影响、共享文件系统和多节点行为后才切换。直接把 Session 改成本地文件会让多节点用户随机掉线。更改 env.php 前备份文件,并通过受控部署同步所有节点;恢复 Redis 后也不能频繁来回切换。

避免再次发生

监控 Redis 存活、used_memory、evicted_keys、connected_clients、rejected_connections、延迟和主从状态。缓存实例需要合适淘汰策略;Session 实例不应因缓存淘汰策略随机丢会话。告警必须在应用 500 前触发。

主从切换后仍 refused

托管 Redis 发生故障切换时,DNS 可能短暂指向旧地址,长驻 PHP/Consumer 还保持失效连接。核对 endpoint TTL、客户端重连设置和消费者日志;Web 恢复后应滚动重启长期 Consumer,但不能同时停止所有交易任务。

区分缓存清空与 Session 丢失

缓存 Redis 可以安全重建,但 Session Redis 的数据丢失会让已登录客户和购物车会话失效。故障复盘应分别统计 cache hit、Session 登录失败和购物车丢失,不要只写“Redis 已恢复”。若使用持久化/副本,定期演练恢复并验证 TTL 与 key 前缀。