缓存失效模式
应用旁路缓存、直写缓存和基于 TTL 的失效策略。
缓存失效模式 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
难题
“计算机科学中只有两件难事:缓存失效和命名。”——Phil Karlton。了解何时以及如何使缓存数据失效至关重要。
基于 TTL 的过期(被动式)
最简单的策略是设置 TTL,并接受缓存可能在这段时间内提供过期数据。适用于允许一定程度数据过期的场景。
<?php
Cache::put("user:1", $user, 300); // expires in 5 minutes automatically写穿式缓存失效
更新数据时,立即删除或更新对应的缓存键。
<?php
function updateUser(int $id, array $data): void {
User::find($id)->update($data);
Cache::forget("user:$id"); // delete cache
// Or re-warm:
Cache::put("user:$id", User::find($id), 300);
}缓存标记
为相关缓存条目添加标记,这样就可以一次使整个组失效——例如,使特定用户的所有缓存条目失效。
<?php
// Store with tags:
Cache::tags(["user:1", "posts"])->put("user:1:recent-posts", $posts, 600);
// Invalidate all "user:1" entries:
Cache::tags("user:1")->flush();事件驱动的缓存失效
在 Laravel 中,使用 Eloquent 模型事件,在模型保存或删除时自动使缓存失效。
<?php
class User extends Model {
protected static function booted(): void {
static::saved(fn($u) => Cache::forget("user:{$u->id}"));
static::deleted(fn($u) => Cache::forget("user:{$u->id}"));
}
}带版本控制的缓存旁路
在缓存键后追加版本号。递增版本号即可使所有现有条目失效,而无需删除它们。
<?php
$v = Cache::get("user:version", 1);
$key = "user:{$id}:v{$v}";
// To invalidate: increment the version
Cache::increment("user:version");概率性提前过期(PER)
为防止缓存击穿,对于一部分请求,在缓存过期之前稍早重新计算缓存。这样可以避免所有服务器上的缓存同时过期。
后台刷新
后台任务会在常用缓存条目过期之前重新填充它们。缓存永远不会为空,因此读取始终很快。
提供过期数据并后台重新验证
立即提供过期数据,同时在后台异步刷新缓存。这样可以消除缓存未命中导致的延迟峰值。
分布式缓存失效
在多服务器环境中,一台服务器使缓存键失效,并不会自动清除其他服务器的本地缓存。请使用 Redis 发布/订阅或共享存储来广播失效通知。
缓存层次结构
对缓存分层:在分布式缓存(Redis)前面放置本地进程内缓存(APCu)。本地缓存速度更快,但数据发生变化时,必须在所有实例中使其失效。
总结
常见模式包括:TTL 过期(简单)、写穿式删除(准确)、标记(分组)和事件驱动(自动)。请根据对数据新鲜度与简单性的不同要求进行选择。
快速检查
Cache::tags()->flush() 会执行什么操作?
用 AI 导师学习 PHP — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 49
- 课程
- 195
常见问题解答
「缓存失效模式」课时是免费的吗?
是的 — 「缓存失效模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「缓存失效模式」这节课中我会学到什么?
应用旁路缓存、直写缓存和基于 TTL 的失效策略。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「缓存失效模式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。