PHP Academy · 课时

缓存失效模式

应用旁路缓存、直写缓存和基于 TTL 的失效策略。

第 4 / 4 课13 个步骤

缓存失效模式 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么 PHP 中的缓存很重要
  2. 将 Redis 用作 PHP 缓存后端
  3. 使用 Memcached 缓存会话和对象
  4. 缓存失效模式
← 返回 PHP Academy