CI3和CI4使用Redis缓存需注意三点:配置修改后必须清理writable/cache/config/并执行php spark cache:clear;CI4必须安装ext-redis扩展而非Predis;cache->save()必须显式传入整数$ttl,且key须加作用域前缀避免冲突。
CI 3 和 CI 4 使用 Redis 缓存不是配个 host 就能跑通的事——配置不清理、扩展装错、漏传,三者任一都会让缓存静默失效。
CI4 启用 Redis 必须装 ext-
redis
,不是 predis
CI4 的
驱动底层调用的是 PHP 原生
类,不是 Predis 库。装错扩展会直接报
,且启动时就失败。
Ubuntu/Debian:
;装完执行
,有输出才算成功
CentOS/RHEL:
Docker 环境:PHP 容器内必须装扩展,且
不能写
,得填 Redis 服务名(如
)
重启 Web 服务或 PHP-FPM 才能让扩展生效,仅重启 Nginx/Apache 不够
改了 app/Config/Cache.php 为什么还是走 file?
CI4 启动时只读一次缓存配置,并编译缓存到
。改完配置不清理,等于白改。
必须手动删掉
下所有文件
再运行
(这个命令清的是运行时缓存,不是配置缓存)
检查是否误改了旧路径
—— CI4 已废弃该位置
运行
确认当前生效的
确实是
不传
会导致线上缓存提前失效
看似简洁,但第三个参数
是整数秒,不传就用配置里的
(默认 300 秒)。很多线上问题就出在这里:本想缓存 1 小时,结果 5 分钟就过期了。
必须显式传整数,如
传浮点数(如
)会被截断为
,不报错但逻辑偏移
传
表示“永不过期”,Redis 实际发
命令,不可靠;文件驱动更不准
高频数据建议设
或
;用户 token 类建议精确到
(15 分钟)
缓存 key 命名不加前缀,等于给所有模块埋雷
CI4 对 key 长度有硬限制(Redis 默认 255 字节),空格和控制符会被过滤。更危险的是 key 冲突:订单模块和用户模块都用
,互相覆盖。
必须加作用域前缀,如
、
避免拼接明文敏感信息(如手机号、token 原值)
不用长动态字符串作 key,优先哈希后截取,如
千万别动配置里的
—— 一改,所有旧 key 全失效,等同于全量缓存击穿
真正卡住人的从来不是“怎么连上 Redis”,而是配置没清、
没传、key 没隔离——这三处不盯死,缓存就是个摆设。
save()$ttlCacheRedisClass 'Redis' not foundsudo apt-get install php-redisphp -m | grep redisyum install php-pecl-redishostlocalhostrediswritable/cache/config/writable/cache/config/php spark cache:clearapplication/config/cache.phpphp spark cache:infohandlerrediscache->save()$ttl$cache->save('key', 'value')$ttl$defaultTime$cache->save('user:123', $data, 3600)30.5300SET18003600900user_123user:profile:123order:status:456substr(md5($uid . $params), 0, 16)$prefix$ttl