Redis缓存需显式调用Cache::get()/set()或Db::table()->cache(),非自动生效;必须确认config/cache.php中default为小写'redis'、redis store配置完整、前缀正确,且通过redis-cli验证key存在及ttl递减。

首页调用 Redis 缓存数据,不是「配好 Redis 就自动缓存」,而是必须显式写 Cache::get() 和 Cache::set(),或者在查询构建器上加 cache() 链式方法。否则哪怕首页渲染了 100 次,每次都是直连数据库。
确认 Redis 驱动已真正启用
很多首页缓存失效,根源是缓存根本没走 Redis —— 它静默 fallback 到了 file 驱动。关键检查点:
-
config/cache.php中'default' => 'redis'是字符串小写,不是'Redis'或数组 -
'stores' => ['redis' => [...]]必须完整存在,且包含'host'、'port'、'select'(整型,不能是字符串"0")、'password' => ''(空密码也得显式写) - 执行
php think cache:clear后,再运行Cache::store('redis')->set('test_key', 'ok', 10),然后用redis-cli连上执行get "think:test_key"(注意默认前缀)能取到值,才说明通了
首页接口数据缓存的两种可靠写法
别依赖模型自动缓存,UserModel::find(1) 或 Db::name('user')->find(1) 默认不走任何缓存层。首页常用的是以下两种:
- 手动读写:在控制器里先查缓存,未命中再查库并写入
$data = Cache::get('home_banner_list');
if (is_null($data)) {
$data = Db::name('banner')->where('status', 1)->order('sort')->select()->toArray();
Cache::set('home_banner_list', $data, 3600);
} - 查询构建器链式缓存(仅限
Db::table()):$list = Db::table('article')->where('is_top', 1)->limit(5)->cache('home_top_articles', 1800)->select();
注意:TTL 单位是秒;Db::name()和Db::query()不支持cache()
首页缓存键名设计与常见坑
首页内容常变,但缓存 key 写错会导致永远拿不到新数据或跨环境污染:
立即学习“PHP免费学习笔记(深入)”;
- 避免硬编码无结构 key:
Cache::get('home_data')→ 改成Cache::get('home:banner:list')或Cache::get('home:article:top5'),便于定位和清理 - 多环境共用 Redis 实例时,
config/cache.php的'prefix'必须区分,比如开发环境设为'prefix' => 'dev_',测试环境用'test_',否则清缓存会互相影响 - 前端带
X-Requested-With: XMLHttpRequest(如 Ajax 请求首页数据),后端却用和普通页面一样的 key,导致接口返回被页面缓存覆盖 —— 建议接口 key 加:api后缀,页面用:page - 用
Cache::tag('home')包裹写入(如Cache::tag('home')->set('banner', $data, 3600)),后续可一键清首页所有缓存:Cache::tag('home')->clear(),比遍历 keys 安全得多
验证首页缓存是否真生效
别只看页面输出,要从 Redis 底层确认:
- 用
redis-cli -h 127.0.0.1 -p 6379连上,执行keys "think:home*"(前缀按你配置的来),确认 key 存在 - 执行
ttl "think:home:banner:list"看剩余秒数是否递减 - 手动
del "think:home:banner:list",刷新首页,观察是否重新生成(且数据库查询日志有新增) - 如果
Cache::get()始终返回 null,检查是否因序列化失败(比如缓存了 Closure 或 resource 类型)—— ThinkPHP 默认用serialize/unserialize,复杂对象建议转成数组再存
最易被忽略的是:缓存键的前缀、驱动配置的完整性、以及 cache() 方法仅对 Db::table() 生效这三点。线上首页卡顿排查时,90% 的“Redis 没起作用”问题都出在这儿。



















