ci3和ci4使用redis缓存需注意三点:配置修改后必须清理writable/cache/config/并执行php spark cache:clear;ci4必须安装ext-redis扩展而非predis;cache->save()必须显式传入整数$ttl,且key须加作用域前缀避免冲突。

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










