thinkphp 5控制器缓存需按场景区分:数据库查询用db::cache()链式调用;自定义数据用cache::set/get;模型层推荐单条记录缓存;请求级缓存需路由或全局配置配合控制器干预。

在 ThinkPHP 5 控制器中调用缓存,核心是区分「缓存驱动」和「缓存使用场景」:你是在缓存数据库查询结果、临时变量、还是整个 HTTP 响应?不同目的对应不同写法,不能混用。
数据库查询结果缓存
这是最常用场景,直接链式调用 cache() 方法即可,无需手动构造键名:
- 启用默认缓存(使用 config/cache.php 中配置的驱动):
$data = Db::table('user')->where('status', 1)->cache(true, 3600)->select(); - 指定缓存标识(避免 URL 参数变动导致缓存失效):
$data = Db::table('article')->cache('hot_articles', 7200)->order('view', 'desc')->limit(10)->select(); - 强制使用 Redis 驱动(即使默认是 file):
$data = Db::table('user')->cache('user_list', 3600, 'redis')->select();
自定义数据缓存(Cache 类)
适合缓存配置、计算结果、API 返回等非查询类数据,统一走 think\Cache:
- 写入缓存:
Cache::set('site_config', $config, 3600); - 读取缓存:
$config = Cache::get('site_config'); - 带前缀或指定驱动:
Cache::store('redis')->set('token_'.$uid, $token, 1800);
模型层缓存(推荐用于单条记录)
在 Model 中封装更安全,尤其配合主键自动缓存键名:
- 在模型方法中使用:
return $this->where('id', $id)->cache('user_'.$id, 3600)->find(); - 支持字段缓存(减少 SHOW COLUMNS 查询):
确保database.php中'fields_cache' => true
请求级缓存(仅 GET,影响响应输出)
这不是控制器内调用,而是全局或路由层控制,但控制器需配合不输出动态内容:
- 全局开启需在
config/app.php加:'request_cache' => true, 'request_cache_expire' => 3600 - 路由单独设置(更精准):
Route::get('api/user/:id', 'api/User/info', ['cache' => ['user/:id', 3600]]); - 控制器中可运行时干预:
$this->request->cache('user_'.$id, 3600);(放在方法开头)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











