Yii2中Redis需正确配置yii\redis\Connection组件并联动session与cache配置,否则session无法存入Redis。必须指定class、hostname、password、database等参数,且session需使用yii\web\RedisSession并指向正确redis组件ID。

Yii2 里 Redis 不是装上就能用的,配置错一个参数,session 就存不进 Redis,Cache 也永远读不到缓存。
redis 组件配置必须指定 class 和 hostname
很多人复制网上配置,漏掉 class 或写成 yii\caching\RedisCache —— 这是缓存类,不是连接组件。Redis 组件本身要指向连接器:yii\redis\Connection。
常见错误现象:Class 'yii\redis\Connection' not found,说明没装扩展;Failed to open redis connection,大概率是 hostname 写成 127.0.0.1 但容器里根本连不通 host.docker.internal。
- 必须用
class => 'yii\redis\Connection' -
hostname推荐用 Docker 网络名(如redis)或host.docker.internal(Mac/Win),别硬写127.0.0.1 - 如果 Redis 开了密码,一定要加
password字段,空字符串也不行,得显式写'' -
database默认是 0,但session和cache最好分库,比如 session 用 1,cache 用 2
session 存到 Redis 要改两个地方:组件 + session 配置
只配好 redis 组件还不够。Yii2 的 session 默认走文件,你得告诉它:“别存本地,去 Redis”。这需要两步联动。
使用场景:用户登录态失效、多实例部署时 session 不同步、文件 session 在高并发下锁争用严重。
- 先在
components里定义redis(见上一节) - 再在
components里配session:class => 'yii\web\RedisSession',且必须设redis => 'redis'(对应组件 ID) - 如果没定义
redis组件 ID 是redis,这里写别的名字会报Unknown component ID: xxx -
timeout建议显式设(如86400),否则依赖 Redis 默认 timeout,容易和 PHPsession.gc_maxlifetime不一致
yii\redis\Connection 和 yii\caching\RedisCache 别混用
这是最常踩的坑:把缓存组件当连接组件用,或者反过来。它们职责完全不同。
参数差异:yii\redis\Connection 关心连接细节(port、database、password);yii\caching\RedisCache 只关心怎么用这个连接存 key-value(比如 keyPrefix、serializer)。
-
cache组件的redis属性,必须指向一个已配置好的yii\redis\Connection实例(ID 字符串) - 不能把
yii\caching\RedisCache直接当连接组件塞进components['redis'],会报Call to undefined method setHostname() - 性能影响:共用一个
Connection实例没问题,但RedisCache和RedisSession各自维护自己的连接池逻辑,不要强行复用同一个对象实例
测试 session 是否真进了 Redis 的最简方法
别信日志,别看浏览器 cookie,直接查 Redis。
容易被忽略的地方:Yii2 的 RedisSession 默认 key 格式是 yii:session:<code>session_id,带前缀且小写;如果你改过 keyPrefix 或用了大小写敏感的 Redis 配置,可能搜不到。
- 用
redis-cli -h your-host -p 6379连上去 - 执行
KEYS yii:session:*(开发环境可用,生产禁用) - 更稳妥的是先
SET test:check "ok",再用 Yii 的\Yii::$app->redis->set('test:check', 'ok')测试连接通不通 - 如果
session写不进,但cache可以,大概率是session组件里redis指向的 ID 错了,或者database配的和 cache 不一致,连到了空库
Redis session 看似就几行配置,但每个字段都卡在连接链路的关键节点上。少一个 class,缺一个 database,或者 hostname 指向宿主机却跑在容器里——都会让 session 彻底静默失效,还不好 debug。









