Laravel 8 中数据库缓存 TTL 应按数据更新频率分档设置:高频(60–300秒)、中频(5–30分钟)、低频(1小时至24小时或永久);优先用 Eloquent remember() 方法;避免 tags() 与 TTL 混用;支持动态 TTL 计算。

在 Laravel 8 中设置数据库缓存的过期时间,核心是让 TTL(Time To Live)匹配数据的真实变化节奏,而不是拍脑袋定个“60分钟”或“1小时”。合理设置能减少数据库压力,又不导致用户看到陈旧数据。
按数据更新频率分档设 TTL
不同业务数据天然有不同的“保鲜期”,直接按类型划分更稳妥:
-
高频数据:如实时订单数、在线用户量、秒杀库存——TTL 建议 60–300 秒。用
Cache::put('live_orders', $count, 120)这类显式写法,避免闭包延迟执行带来的不可控。 -
中频数据:如用户个人资料、文章分类列表、权限菜单——TTL 推荐 5–30 分钟。适合用
Cache::remember('user:profile:'.$id, 900, fn() => User::find($id))。 -
低频数据:如站点配置、静态字典、法律条款——TTL 可设为 1–24 小时,甚至用
Cache::rememberForever()配合手动失效(如配置更新时触发Cache::forget('site_config'))。
用 Eloquent 的 remember() 方法简化查询缓存
Laravel 8 的 Eloquent 模型原生支持 remember(),比手动调用 Cache 门面更简洁,且自动处理键名拼接:
- 基础用法:
User::where('active', 1)->remember(3600)->get(),缓存 1 小时。 - 带自定义键名:
Post::where('status', 'published')->remember(7200, 'published_posts')->get(),便于后续精准清理。 - 链式调用注意顺序:
remember()必须放在get()、first()或paginate()之前,否则不生效。
避免标签(tags)与 TTL 混用踩坑
Laravel 8 的 Cache::tags() 不接受 TTL 参数,尤其在 Redis 驱动下容易误用:
- ❌ 错误写法:
Cache::tags(['user'])->put('profile:1001', $data, 1800)—— 会报错或静默忽略 TTL。 - ✅ 正确做法:若需标签+独立过期,改用语义化键前缀 + 显式 TTL,例如
Cache::put('user:profile:1001', $data, 1800),清理时用 Redis 命令通配删除:redis-cli keys "user:profile:*" | xargs redis-cli del。 - ⚠️ 注意:file 和 database 驱动根本不支持
tags(),调用直接抛异常,生产环境务必确认驱动类型。
结合业务上下文动态调整 TTL
固定 TTL 不够灵活,Laravel 8 允许运行时计算,提升适应性:
-
按用户角色:管理员看的数据要更及时,普通用户可容忍延迟。
$ttl = auth()->user()?->is_admin ? 60 : 3600; -
按请求时段:白天高并发时缩短 TTL(如 5 分钟),凌晨延长(如 2 小时),用
now()->hour判断后赋值。 -
按外部 API 的 Cache-Control:调用第三方接口后,读取响应头
$response->headers->get('Cache-Control'),提取max-age=3600并转为本地 TTL。


















