laravel 8中缓存数据库数据的核心是安全存储、准确读取与及时失效,应使用cache::remember()方法,配合唯一可预测键名(如'user:profile:'.$userid)、合理ttl、redis驱动及变更时主动清除。

Laravel 8 中用 Cache 缓存数据库数据,核心是避免重复查询、提升响应速度,关键不在“能不能存”,而在于“怎么存得安全、读得准、失效得及时”。
基础缓存:用 remember 避免重复查库
最常用也最推荐的方式是 Cache::remember(),它自动处理“查缓存→未命中→执行查询→写入缓存→返回”整个流程,原子性强,不易出错。
- 缓存键必须唯一可预测,比如按业务+参数组合:
'user:profile:'.$userId或'posts:status:'.$status.':page:'.$page - 过期时间设合理值,高频变动数据(如订单状态)建议 5–30 分钟;静态数据(如分类列表)可设 1 小时以上
- 闭包里必须 return 查询结果,不能只调用
get()或paginate()而不返回:return Post::where('status', $status)->paginate(15);
分页数据也能缓存,但要缓存结果而非构建器
Laravel 的 LengthAwarePaginator 对象可完整序列化,适合缓存。但注意:不能缓存 Builder 实例(如 Post::query()),必须等 paginate() 执行完再缓存。
- 键名建议包含分页参数,例如:
'posts:paged:sort:'.$sort.':page:'.$request->input('page') - 闭包内直接返回分页器:
return Post::orderBy($sort)->paginate(20); - 若需刷新某页缓存(如管理员更新内容),用
Cache::forget($key)清除对应项即可
驱动选 Redis,别卡在 file 默认配置上
默认 CACHE_DRIVER=file 仅适合本地开发或低流量场景。上线务必切到 Redis(或 Memcached):
- 修改
.env:CACHE_DRIVER=redis—— 这步必须最先做,否则后续配置无效 - 在
config/cache.php的stores.redis中补全connection和prefix:'connection' => 'cache', 'prefix' => env('CACHE_PREFIX', 'app_v1:') -
.env加CACHE_PREFIX=prod:site_a:,防止多租户/多环境键名冲突 - 运行
php artisan config:clear,再用tinker测试:Cache::store('redis')->put('test', 'ok', 60)
空结果和永久缓存要小心处理
查不到数据时,不要让缓存返回 null,否则可能被反复查询;也不要无脑用 rememberForever。
- 查无结果可缓存短时效“空标记”:
Cache::put('user:999:miss', true, 60),下次先检查该标记再决定是否查库 -
rememberForever适合国家列表、站点配置等极低频更新数据,但必须配套手动清理逻辑:
更新数据后立刻Cache::forget('config:v2:countries') - 键名加版本号(如
v2)或业务前缀(如user:),方便后续批量清理:php artisan cache:clear不清 Redis 全局,但可用redis-cli按前缀删











