0Pricing
PHP Academy · レッスン

キャッシュ無効化のパターン

cache-aside、write-through、TTLベースの無効化戦略を適用します

「キャッシュ無効化のパターン」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

難しい問題

「コンピューターサイエンスで難しいことは、キャッシュの無効化と名前付けの2つだけです。」— 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)

キャッシュスタンピードを防ぐため、一部のリクエストでは有効期限が切れる少し前にキャッシュを再計算します。すべてのサーバーで同時に有効期限が切れることを防げます。

バックグラウンド更新

バックグラウンドジョブが、頻繁に読み取られるキャッシュエントリを有効期限前に再生成します。キャッシュが空になることがないため、読み取りは常に高速です。

Stale-While-Revalidate

古いデータを直ちに返しながら、バックグラウンドで非同期にキャッシュを更新します。キャッシュミスによるレイテンシーの急増をなくせます。

分散キャッシュの無効化

複数サーバー構成では、1台のサーバーがキャッシュキーを無効化しても、他のサーバーのローカルキャッシュは自動的に消去されません。Redis Pub/Subまたは共有ストアを使用して、無効化をブロードキャストします。

キャッシュ階層

キャッシュを階層化します。分散キャッシュ(Redis)の前段に、ローカルのプロセス内キャッシュ(APCu)を置きます。ローカルキャッシュは高速ですが、データ変更時にはすべてのインスタンスで無効化する必要があります。

まとめ

一般的なパターンには、TTLによる有効期限切れ(シンプル)、ライトスルー削除(正確)、タグ付け(グループ単位)、イベント駆動型(自動)があります。データの鮮度をどの程度重視するかと、シンプルさのバランスに応じて選択してください。

理解度チェック

Cache::tags()->flush()は何をしますか。

よくある質問

「キャッシュ無効化のパターン」レッスンは無料ですか?

はい。「キャッシュ無効化のパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「キャッシュ無効化のパターン」で何を学びますか?

cache-aside、write-through、TTLベースの無効化戦略を適用します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「キャッシュ無効化のパターン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. PHPでキャッシュが重要な理由
  2. PHPのキャッシュバックエンドとしてRedisを使う
  3. セッションとオブジェクトのキャッシュにMemcachedを使う
  4. キャッシュ無効化のパターン
← PHP Academyに戻る