必须用cache.adapter.redis_tag_aware并正确配置default_redis_provider,否则缓存静默退化为内存存储;需确保APP_ENV=prod且APP_DEBUG=false,DSN格式严格为redis://host:port,禁用冒号等PSR-6保留字符。

修改 Symfony 的缓存驱动配置,核心是选对适配器、填对连接参数、匹配运行环境。不是改个 YAML 就完事,漏掉关键项会导致缓存静默退化为内存存储,你以为在用 Redis,其实什么都没走。
确认当前环境已切到生产模式
所有缓存配置只在 APP_ENV=prod 且 APP_DEBUG=false 时生效。开发环境下哪怕配了 Redis,也会强制 fallback 到 filesystem 或 array 适配器。
- 检查 .env 或 .env.local:必须同时存在 APP_ENV=prod 和 APP_DEBUG=false
- 执行 php bin/console debug:container --env=prod | grep debug,输出中不能含 debug: true
- 部署后务必运行:php bin/console cache:clear --env=prod && php bin/console cache:warmup --env=prod
选对缓存适配器类型
不同场景对应不同适配器,不能混用:
-
cache.adapter.redis_tag_aware:推荐用于生产,支持
invalidateTags(),适合用户资料更新后批量清除相关缓存 - cache.adapter.redis:仅基础键值操作,无标签能力,控制粒度粗,不建议用于需精细失效的业务
- cache.adapter.filesystem:适合开发调试或无法部署 Redis 的环境,但需确保 var/cache 可写且已安装 symfony/filesystem
- cache.adapter.pdo:用数据库表存缓存元数据,需额外建表,性能弱于 Redis,属兜底方案
正确配置 Redis 连接与池定义
只改 app: 不够,必须同步设置 default_redis_provider 并显式声明缓存池。
- 在 config/packages/cache.yaml 中写入:
framework:
cache:
default_redis_provider: 'redis://127.0.0.1:6379'
pools:
cache.app:
adapter: cache.adapter.redis_tag_aware
provider: cache.default_redis_provider
- DSN 必须带 redis:// 前缀,含密码时写成
redis://user:pass@host:6379 - Docker 环境下避免用
localhost,Mac/Win 改用host.docker.internal,Linux 用宿主机 IP - Redis Cluster 不支持该字段,需自定义服务并注入节点列表
验证配置是否真正生效
别只看控制台没报错,要实测落地效果:
- 执行 php bin/console cache:pool:stats 查看
cache.app的命中率和存储类型 - 代码中调用
$cache->getItem('test_key')->isHit(),再手动检查 var/cache/prod/pools/ 下是否有文件(Redis 环境下应无文件,filesystem 才有) - 连 Redis 控制台执行
redis-cli -h 127.0.0.1 ping,返回 PONG 才说明连接通 - 缓存键名禁用冒号
:、花括号等 PSR-6 保留字符,用user_profile_123替代user:profile:123











