必须配置Redis集群并启用schema缓存:在config/web.php中将cache组件class设为yii\redis\Cache,显式声明clusters数组、keyPrefix,同时db组件中设置schemaCachingDuration≥3600且enableSchemaCache=true。

要让 Yii 应用在高并发场景下数据库查询不拖慢响应,必须把高频读取的数据稳稳压进缓存层,而不是每次请求都穿透到 MySQL。这要求缓存组件不仅得配对,还得配准——键前缀、超时策略、连接池参数、集群拓扑,一步错就导致缓存击穿或脏数据。
配置 Redis 集群作为主缓存组件
打开 config/web.php 或 config/main.php,在 components 数组内替换默认的 FileCache:
将 'class' => 'yii\caching\FileCache' 替换为 'class' => 'yii\redis\Cache',并确保已安装 yiisoft/yii2-redis 扩展(通过 Composer 安装)。
在 'redis' 子配置中,【必须显式声明 clusters 数组】,不能只写单个 hostname+port;集群节点列表需包含全部 master 节点地址(Redis Cluster 模式下 slave 不参与 key 分配,客户端自动重定向):
'clusters' => [ '192.168.10.101:7000', '192.168.10.102:7000', '192.168.10.103:7000' ]
设置 'keyPrefix' => 'prod_v2_' —— 这个前缀必须全局唯一,否则多应用共用同一 Redis 集群时会互相覆盖缓存项;开发环境建议用 dev_,测试环境用 test_,严禁留空或使用默认值。
启用 Schema 缓存加速 ActiveRecord 查询
数据库表结构元信息(字段名、类型、索引)每次请求都查 INFORMATION_SCHEMA 会严重拖慢 ActiveRecord 初始化速度。必须启用 schema 缓存:
在 'db' 组件配置中添加:'schemaCachingDuration' => 3600(单位秒)。
⚠️ 注意:该配置生效的前提是 【cache 组件已正确启用且可用】;如果 cache 组件未初始化或连接失败,schema 仍会走实时查询,且无任何报错提示。
同时确认 'enableSchemaCache' => true 已开启(Yii 2.0.13+ 默认 true,但旧项目可能手动关闭)。
按场景选择缓存策略
方法一:高频不变数据 → 使用 getOrSet() 自动兜底
直接调用 Yii::$app->cache->getOrSet($key, [$this, 'loadExpensiveData'], 86400),无需手动判空+写入两步操作;回调函数仅在缓存 miss 时执行一次,天然防雪崩。
方法二:强一致性更新 → 先删缓存再改库
用户资料修改后,立刻执行 Yii::$app->cache->delete('user_profile_' . $id),而非 set();避免数据库事务未提交时缓存被提前覆盖,导致短暂脏读。
方法三:页面级缓存 → 绑定参数与依赖项
在控制器中定义过滤器:['class' => 'yii\filters\PageCache', 'only' => ['view'], 'duration' => 300, 'variesBy' => ['id'], 'dependency' => ['class' => 'yii\caching\DbDependency', 'sql' => 'SELECT MAX(updated_at) FROM post']。这样文章内容一更新,所有相关页面缓存自动失效。



















