tp5 不支持 cache::remember(),因其缓存门面仅提供 get/set/has 等基础方法,无自动缓存穿透防护与闭包回调机制;需手动实现“查-判-查库-写缓存”逻辑,并显式配置 redis 驱动才生效。

ThinkPHP 5 没有内置 Cache::remember() 方法——这是 ThinkPHP 6.1+ 和 Laravel 才有的语法。TP5 的缓存操作需手动组合 Cache::get() 和 Cache::set(),或自行封装类似逻辑。
为什么 TP5 不能直接用 remember
TP5 的缓存门面(think\Cache)只提供基础方法:get、set、has、rm 等,不包含自动缓存穿透防护、原子写入或闭包回调机制。所谓「remember」语义(查缓存→未命中则执行并写入)需开发者自己实现。
TP5 中模拟 remember 的安全写法
为避免高并发下重复查询和缓存击穿,推荐用以下结构替代:
- 使用唯一键名,含业务参数,例如
'user_list_status_' . $status,禁止硬编码如'user_list' - 先调
Cache::get($key),命中则直接返回 - 未命中时,用
Cache::set($key, $value, $expire)写入,且确保$value是闭包真实执行结果 - 关键:在
set前加一层简单锁(如 Redis 的SETNX+ 过期时间),或依赖缓存驱动自身原子性(Redis 驱动可支持)
必须显式配置 Redis 驱动才有效
TP5 默认缓存驱动是 File,即使写了 Cache::set('x', 'y', 3600) 也不会走 Redis。要启用 Redis:
- 在
config/cache.php中设置'default' => 'redis' - 确认
redis配置项已填写 host/port/auth 等,并启用'serialize' => 'php'(尤其涉及对象缓存时) - 测试是否生效:
dump(Cache::store('redis')->get('test'));
对比 TP6/Laravel 的 remember 写法(供升级参考)
如果你后续计划升级到 TP6 或已混用 TP6 组件,请注意语法差异:
- TP6:
Cache::remember('key', 3600, function () { return Db::table('user')->select(); }); - Laravel:
Cache::remember('key', 60, fn() => User::where('status', 1)->get()); - TP5 不支持这种写法,强行调用会报
Call to undefined method think\Cache::remember()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











