キャッシュ無効化とは - TTL・イベント駆動・パージ戦略の比較

キャッシュ無効化は古くなったキャッシュデータを最新に更新する仕組み。TTL 方式・Write-through・イベント駆動パージの使い分けと実装パターンを解説

キャッシュパフォーマンス

キャッシュ無効化とは

キャッシュ無効化 (Cache Invalidation) は、キャッシュされたデータがソースデータと乖離した際に、キャッシュを最新の状態に更新または削除する仕組みである。Phil Karlton の名言「コンピュータサイエンスで難しいことは 2 つだけ。キャッシュの無効化と命名だ」が示すとおり、正しく実装するのが最も困難なキャッシュの課題だ。

無効化戦略の比較

無効化戦略の比較を以下に示す。

戦略仕組み整合性複雑さ
TTL有効期限で自動削除TTL 内は古いデータ低い
Write-Through書き込み時にキャッシュも更新常に最新中程度
Write-Behind書き込みをキャッシュに行い、非同期で DB に反映最新だが DB 遅延あり高い
イベント駆動データ更新イベントでキャッシュを無効化ほぼ最新中程度
手動パージ明示的にキャッシュを削除操作時のみ最新低い

TTL ベースの無効化

最もシンプルで広く使われる。キャッシュに有効期限を設定し、期限切れで自動削除する。

// Redis でのキャッシュ + TTL
async function getUser(userId: string): Promise<User> {
  const cached = await redis.get(`user:${userId}`);
  if (cached) return JSON.parse(cached);

  const user = await db.users.findById(userId);
  await redis.setex(`user:${userId}`, 300, JSON.stringify(user)); // 5分 TTL
  return user;
}

TTL 内は古いデータが返る可能性がある。許容できる古さ (Staleness) に応じて TTL を設定する。

イベント駆動の無効化

DynamoDB Streams + Lambda でキャッシュを即座に無効化する。

CloudFront のキャッシュ無効化

デプロイ時に aws cloudfront create-invalidation --paths "/*" で全キャッシュを無効化するのが一般的だ。ただし、インバリデーションはエッジロケーション全体に伝播するまで数分かかる。

より良いアプローチは、コンテンツハッシュをファイル名に含めること (app.a1b2c3.js)。ファイル内容が変わればハッシュが変わるため、インバリデーション不要で即座に新しいファイルが配信される。

よくある失敗パターン

キャッシュと DB の不整合

DB を更新してからキャッシュを更新するまでの間に、別のリクエストが古いキャッシュを読む。対策: キャッシュを「更新」ではなく「削除」する (Cache-Aside パターン)。次のリクエストでキャッシュミスが発生し、DB から最新データを取得する。

Thundering Herd

人気のあるキャッシュキーが TTL 切れになると、大量のリクエストが同時に DB に殺到する。対策: キャッシュの TTL にジッター (ランダムな揺らぎ) を加え、同時に期限切れになるのを防ぐ。

キャッシュ無効化の背景や設計思想は関連書籍に詳しい。

この記事は役に立ちましたか?

関連用語

関連する記事