必须用Redis集群替换文件缓存才能将首页响应压至600毫秒内、QPS提升至420;需确认PHP≥7.4、Redis扩展启用且服务端≥2.6.12,配置时注意clusters为数组、节点带端口,强一致性场景须用DbDependency并确保缓存删除在事务提交后。

在高并发电商秒杀或大促活动中,Yii 2.0.55 应用若仍使用文件缓存或未启用 Redis 集群,首页加载可能卡在 2.8 秒以上,数据库连接数飙升至 68,QPS 崩溃到 85;必须通过 Redis 缓存组件替换并启用集群拓扑,才能将响应压进 600 毫秒内、QPS 提升至 420。
确认环境与版本兼容性
检查 PHP 版本是否 ≥7.4:执行 php -v,低于 7.4 则无法运行 Yii 2.0.55。该版本已移除对 PHP 7.3 及更早版本的支持路径。
验证 Redis 扩展已启用:运行 php -m | grep redis,输出必须含 redis。若无输出,需安装 php-redis 扩展并重启 php-fpm 或 Apache。
【Redis 服务端最低要求为 2.6.12】,低于此版本将导致 yii\redis\Cache 初始化失败且不报明确错误,仅静默回退至空缓存——这是线上缓存失效却查不出原因的最常见陷阱。
配置 Redis 集群缓存组件
打开 config/web.php,在 'components' 数组中添加以下配置:
'cache' => [ 'class' => 'yii\redis\Cache', 'keyPrefix' => 'myapp_v2_202608_', 'redis' => [ 'class' => 'yii\redis\Connection', 'hostname' => 'redis-node1.example.com', 'port' => 6379, 'password' => 'your-strong-password', 'database' => 0, 'clusters' => [ 'redis-node1.example.com:6379', 'redis-node2.example.com:6379', 'redis-node3.example.com:6379', ], ],],
注意:'clusters' 是数组形式,不是字符串;节点地址必须带端口,且不能包含协议头(如 redis://)。
若使用哨兵模式而非原生集群,需改用 'yii\redis\ SentinelConnection' 类,并配置 'sentinels' 和 'masterName' 字段——但 Yii 2.0.55 对哨兵的自动故障转移支持存在已知竞态,生产环境优先选用 Redis Cluster 模式。
在业务逻辑中安全使用缓存
第一步:封装缓存读写逻辑,避免裸调 get()/set()。
第二步:使用 getOrSet() 替代手动判断,防止缓存击穿。例如商品详情查询:
$product = \Yii::$app->cache->getOrSet( 'product_'.$id, function () use ($id) { return \app\models\Product::findOne($id); }, 3600 // 缓存 1 小时);
第三步:对库存类强一致性场景,必须配合 DbDependency。例如购物车数据缓存:
$cart = \Yii::$app->cache->getOrSet( 'cart_'.$uid, function () use ($uid) { return \app\models\Cart::find()->where(['uid' => $uid])->all(); }, 1800, new \yii\caching\DbDependency([ 'sql' => 'SELECT MAX(updated_at) FROM {{%cart}} WHERE uid = :uid', 'params' => [':uid' => $uid], ]));
第四步:在数据变更后主动删除相关缓存键,例如订单创建成功后执行 \Yii::$app->cache->delete('user_orders_'.$uid)。
【严禁在事务未提交前写入缓存】,否则会导致缓存与数据库状态不一致——这一步必须放在 $transaction->commit() 之后。


















