Service层可直接用Cache门面,需use think\facade\Cache;,禁用已移除的S()函数;多store场景推荐Cache::store('redis')->get();remember()必须显式传过期时间;tag清理依赖驱动支持且配置正确。

Service 层里直接用 Cache 门面就行
ThinkPHP 6/8 的 Cache 是全局可用的门面类,Service 层不需要额外注入或初始化,只要确保命名空间正确(use think\facade\Cache;),就能直接调用 set()、get()、remember() 等方法。
常见错误现象:Service 类里写 Cache::get('key') 报错 Class 'Cache' not found,本质是漏了 use 声明;或者用了旧版 TP5 的 S() 函数,但在 TP6+ 中已被移除。
- TP6/8 必须写
use think\facade\Cache;,不能只靠自动加载 - 不推荐在 Service 构造函数里提前实例化
Cache::store('redis'),除非你明确要切换驱动且该 Service 只服务于单一存储 - 如果项目启用了多缓存 store(如同时配了
redis和file),用Cache::store('redis')->get('key')比Cache::get('key')更可控
cache() 助手函数在 Service 里能用,但有隐性风险
cache() 是全局函数,Service 层可以直接调用,比如 cache('user_1001', $data, 3600)。但它底层仍走的是默认 store,且不支持传入 store 名称参数——这意味着你无法在单次调用中临时指定用 redis 还是 file。
容易踩的坑:
立即学习“PHP免费学习笔记(深入)”;
评估聊天、邮件、电话、社交平台私信(DM)或电商平台客服团队的服务质量。适用于团队需要制定 QA 评分卡、故障模式分析、辅导计划、校准检查清单或服务改进简报,但无法访问实时工单系统、CRM 或联络中心系统的情况。
- TP6 开始
cache()默认绑定defaultstore,而default可能被配置成file,但你本意想缓存到 redis - 在单元测试中,
cache()调用可能因环境配置差异导致行为不一致(比如测试环境用 file,生产用 redis) - 若你在 Service 里混用
Cache::get()和cache('key'),缓存 key 前缀可能不统一(Cache门面会读取配置中的prefix,而cache()函数在某些老版本中会忽略)
Service 调用 Cache::remember() 时必须显式传过期时间
Cache::remember() 不会读取配置里的全局 expire,它的第二个参数是强制必填的整数秒数。写成 Cache::remember('user_1001', function () { return User::find(1001); }) 会直接报错或使用驱动默认值(通常是 0,即永不过期),这不是你想要的。
实操建议:
- 永远写全三个参数:
Cache::remember('user_1001', 3600, function () { return User::find(1001); }) - 避免把过期时间硬编码成数字,可提取为常量或从配置读取:
config('cache.user_expire') ?? 1800 - 注意闭包内抛出异常时,
remember()不会缓存异常结果,但会重试执行闭包——如果闭包本身有副作用(如发 HTTP 请求),需自行加锁或兜底
Service 层清理缓存时别依赖 Cache::tag() 的“直觉”行为
很多人在 Service 里写 Cache::tag('user')->clear(),以为能删掉所有打上 user 标签的缓存,但实际是否生效,完全取决于当前驱动是否真正支持标签索引。
关键点:
-
File驱动根本不实现tags方法,调用静默返回true,缓存一条没删 -
Redis驱动必须配置tag_prefix(如'tag_prefix' => 'tp_tag:'),否则写入和查询的标签 key 对不上 - 只有通过
Cache::tag('user')->set('key', $val, 3600)写入的缓存,才能被Cache::tag('user')->clear()清理;用Cache::set('key', $val, 3600, ['user'])打标的方式,在部分 TP 版本中无法保证索引写入完整
复杂点在于:缓存清理逻辑一旦写错,线上就可能出现脏数据,而且很难复现——因为问题只在特定驱动+特定配置组合下暴露。


















