キャッシュ

頻繁にアクセスされるデータを高速なストレージに保存し、読み取り性能を向上させる手法

パフォーマンス設計
キャッシュ」の技術書を見る (4 冊) →

キャッシュとは

キャッシュは、頻繁にアクセスされるデータを高速なストレージ (メモリ) に保存し、読み取り性能を向上させる手法である。「コンピュータサイエンスで難しいことは 2 つだけ。キャッシュの無効化と命名だ」(Phil Karlton) という格言があるほど、正しく運用するのは難しい。

キャッシュの階層

キャッシュの階層を図で示す。

ブラウザキャッシュ (最速、ユーザーごと)
  ↓ ミス
CDN キャッシュ (CloudFront、エッジロケーション)
  ↓ ミス
アプリケーションキャッシュ (ElastiCache / Redis)
  ↓ ミス
データベース (DynamoDB / RDS)

キャッシュ戦略

キャッシュ戦略を以下にまとめる。

戦略読み取り書き込み用途
Cache-Asideキャッシュミス時に DB から取得してキャッシュDB に書き込み、キャッシュを無効化汎用
Read-Throughキャッシュが自動的に DB から取得-DAX
Write-Through-キャッシュと DB に同時書き込み一貫性重視
Write-Behind-キャッシュに書き込み、非同期で DB に反映書き込み性能重視

Cache-Aside の実装

Cache-Aside の実装のコード例を示す。

async function getUser(id: string): Promise<User> {
  // 1. キャッシュを確認
  const cached = await redis.get(`user:${id}`);
  if (cached) return JSON.parse(cached);

  // 2. キャッシュミス → DB から取得
  const user = await db.get({ TableName: 'users', Key: { id } });

  // 3. キャッシュに保存 (TTL 1時間)
  await redis.set(`user:${id}`, JSON.stringify(user.Item), 'EX', 3600);
  return user.Item as User;
}

キャッシュの無効化

キャッシュの無効化を以下にまとめる。

方法説明トレードオフ
TTL (Time-To-Live)一定時間後に自動削除古いデータが TTL まで残る
明示的削除更新時にキャッシュを削除削除漏れのリスク
イベント駆動DynamoDB Streams で変更を検知して削除実装が複雑

AWS でのキャッシュ

AWS でのキャッシュを以下にまとめる。

レイヤーサービスTTL の目安
CDNCloudFront静的ファイル: 1 日、API: 数秒〜数分
アプリケーションElastiCache (Redis)数分〜数時間
DBDynamoDB DAX数分
DNSRoute 5360〜300 秒

よくある失敗

  • キャッシュの TTL が長すぎて古いデータが表示される
  • キャッシュの無効化漏れで、更新が反映されない
  • キャッシュスタンピード: TTL 切れ時に大量のリクエストが DB に殺到

現場での応用を知るには関連書籍も役立つ。

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

関連用語

関連する記事