yii2的redis+文件双驱缓存策略核心是分层协作:redis为主缓存承担生产环境高频读写,文件缓存仅作开发调试或redis降级兜底;严禁双写,统一由redis管理缓存生命周期,文件缓存不参与写操作。

Yii2 的 Redis + 文件双驱缓存策略,不是简单叠加两种缓存,而是按层级分工协作:文件缓存作兜底与开发友好层,Redis 承担生产环境的主缓存角色。关键在于避免重复写、错位失效和资源争抢,让两者各司其职。
Redis 作为主缓存驱动
生产环境下,应将 cache 组件完全指向 Redis,而非保留文件缓存作为主力。文件缓存 I/O 锁竞争严重,高并发时易成瓶颈。
- 配置使用
yii\redis\Cache,确保 Redis 服务稳定且网络低延迟 - 设置统一
keyPrefix(如prod_),防止多应用键冲突 - 敏感数据(如用户会话、购物车)必须走 Redis,因其支持原子操作与过期自动清理
- 启用
getOrSet()简化逻辑,避免手动判空+写入的竞态风险
文件缓存仅用于开发或降级场景
文件缓存不该参与线上核心链路,但可保留在配置中作为 fallback 或本地调试辅助。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 开发环境可默认用
yii\caching\FileCache,便于排查缓存内容(直接看文件) - 若需降级机制(如 Redis 不可用),可通过 try-catch 切换到文件缓存,但需明确标记“只读”且不更新
- 切勿在同一个业务逻辑里同时对 Redis 和文件缓存做
set()—— 容易导致状态不一致
避免双写与失效不同步
所谓“双驱”,不等于“双写”。常见错误是数据变更时既删 Redis 又删文件缓存,结果因执行顺序或失败导致残留脏数据。
- 线上只维护 Redis 缓存生命周期,文件缓存不参与写操作
- 缓存失效统一走 Redis 的
delete()或带前缀的flush(),不触碰文件目录 - 如需清空全部缓存,优先调用
Yii::$app->cache->flush(),它会作用于当前激活的缓存组件(即 Redis)
配合 Schema 缓存与查询缓存提升数据库效率
缓存不只是业务数据,元信息和 SQL 结果同样关键。这两类缓存虽不依赖 Redis,但能大幅降低 DB 压力,间接放大 Redis 缓存收益。
- 开启
enableSchemaCache并设schemaCacheDuration≥ 3600,避免每次请求都查INFORMATION_SCHEMA - 启用
enableQueryCache,并指定queryCache为同一 Redis 实例,让慢查询结果也进内存 - 注意:查询缓存对
INSERT/UPDATE/DELETE自动失效,无需手动干预










