缓存 API 查询结果前须确认数据适合缓存,避免缓存用户敏感信息、实时数据或依赖动态上下文的响应;应使用 Cache::remember() 封装查询,构造带版本号的确定性缓存键,并在模型更新时同步清除缓存。

缓存 API 查询结果前,先确认数据是否真的适合缓存
不是所有 API 响应都该塞进缓存。比如用户个人资料接口返回 auth()->user(),缓存 5 分钟可能导致登出后仍能访问旧数据;又比如实时行情接口,缓存 1 秒都可能出问题。
适合缓存的典型场景:GET /api/products(商品列表,不常变)、GET /api/categories(分类树,后台修改频率低)、GET /api/settings(全局配置,几乎静态)。
- 检查响应是否依赖当前用户身份(
Auth::id()、request()->ip()等),有则需加用户维度键前缀 - 确认数据变更路径:是仅通过 Laravel 模型操作?还是有外部脚本直连数据库?后者会绕过缓存失效逻辑
- 避免缓存含敏感字段的响应(如
email、phone),尤其当缓存驱动是共享式(Redis、Memcached)时
用 Cache::remember() 封装查询,别手动 get + put
Cache::remember() 是最常用也最容易写错的方式。它自动处理「查缓存 → 未命中 → 执行闭包 → 写入缓存」全流程,比手写 Cache::get() + Cache::put() 少三个出错点。
常见错误:把整个 Response 对象塞进缓存(Laravel 不序列化响应对象),或在闭包里用了未绑定的变量($request 未 use)。
- 只缓存原始数据(数组、集合),不要缓存
response()->json()或Resource实例 - 闭包内若需请求参数,必须显式
use ($request),否则报Undefined variable - 缓存时间建议设具体秒数(如
3600),别用now()->addHours(1)—— 序列化后时间对象可能失效
示例:
return Cache::remember('products_list_'.$request->query('category'), 3600, function () use ($request) {
return Product::where('category_id', $request->query('category'))
->select('id', 'name', 'price')
->get();
});
缓存键设计要防冲突,别裸用 URL 或 ID
直接用 request()->fullUrl() 当缓存键,看似省事,但参数顺序变化(?a=1&b=2 vs ?b=2&a=1)会导致重复缓存;只用 $id 则忽略分页、排序等上下文。
正确做法是构造确定性键名:固定前缀 + 关键参数哈希 + 版本号(便于批量刷新)。
- 用
md5(json_encode($params))处理多参数,比拼接字符串更安全 - 给键加版本号,如
'v2_products_list_'.md5(...),改结构时只需改版本号,旧缓存自然淘汰 - 避免在键中包含用户 ID(除非明确做用户级缓存),否则 Redis 内存暴涨且难以清理
模型更新时主动清除相关缓存,别等 TTL 过期
商品价格改了,但缓存还挂着旧价,用户刷半天才更新——这不是缓存没用好,是没管好失效。
Laravel 的 Observing 或事件监听是主流方案,但要注意:清除动作必须和数据库事务一致,否则出现「DB 已更新,缓存未删」的脏状态。
- 在模型
updating/updated事件里调用Cache::forget(),而非在 Controller 中手工删 - 使用
Cache::tags()前确认缓存驱动支持(File、Array 不支持),生产环境推荐 Redis - 慎用通配符清除(如
Cache::getPrefix().'*'),Redis 没原生支持,得用SCAN,线上高并发时可能卡住
示例(在 Product 模型中):
protected static function booted()
{
static::updated(fn ($product) => Cache::forget('products_list_'.$product->category_id));
}
缓存不是开关一开就万事大吉的事。键怎么命、失效怎么触、数据边界在哪,每一步都得对着真实请求链路去抠——特别是多个服务共用一个 Redis 时,一个没打标签的 Cache::put() 可能悄悄污染别人的缓存空间。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











