TTL

データやキャッシュの有効期限を設定し、自動的に削除・更新する仕組み

キャッシュデータベース

TTL とは

TTL (Time to Live) は、データやパケットに有効期限を設定し、期限切れ後に自動的に削除・無効化する仕組みである。キャッシュDNS、データベース、ネットワークなど、ソフトウェアのあらゆる層で使われる基本概念だ。

TTL がなければ、古いデータが永遠に残り続ける。キャッシュは際限なく肥大化し、DNS の変更は伝播せず、セッションは永久に有効になる。TTL はデータの鮮度とリソースの有限性を保証する。

使われる場面と設定値の目安

使われる場面と設定値の目安を以下に示す。

場面典型的な TTL設定場所
ブラウザキャッシュ1 時間〜1 年Cache-Control: max-age=3600
CDN キャッシュ1 分〜24 時間CloudFront のキャッシュポリシー
DNS レコード300 秒〜86400 秒Route 53 のレコード設定
DynamoDB アイテム1 時間〜90 日アイテムの TTL 属性
Redis キャッシュ5 分〜1 時間SET key value EX 300
JWT トークン15 分〜1 時間exp クレーム
セッション30 分〜24 時間CookieMax-Age

DynamoDB の TTL

DynamoDB の TTL は、アイテムに Unix エポック秒のタイムスタンプ属性を設定し、期限切れアイテムを自動削除する機能だ。削除は非同期で行われ、追加コストはかからない。

// TTL 属性付きでアイテムを保存
const ttl = Math.floor(Date.now() / 1000) + 60 * 60 * 24; // 24時間後

await ddb.send(new PutCommand({
  TableName: 'Sessions',
  Item: {
    sessionId: 'sess-abc123',
    userId: 'user-456',
    expiresAt: ttl,  // TTL 属性 (Unix エポック秒)
  },
}));

注意点: DynamoDB の TTL 削除は「期限切れ後 48 時間以内」に実行される。即座に削除されるわけではないため、クエリ時にも TTL を条件に含めるのが安全だ。

// TTL 切れアイテムを除外するクエリ
const now = Math.floor(Date.now() / 1000);
await ddb.send(new QueryCommand({
  TableName: 'Sessions',
  KeyConditionExpression: 'sessionId = :sid',
  FilterExpression: 'expiresAt > :now',
  ExpressionAttributeValues: { ':sid': sessionId, ':now': now },
}));

CloudFront の TTL

CloudFront のキャッシュ TTL は、オリジンへのリクエスト頻度とコンテンツの鮮度のトレードオフだ。

  • 静的アセット (JS, CSS, 画像): 長い TTL (1 年) + ファイル名にハッシュを含める
  • HTML ページ: 短い TTL (数分〜数時間) またはキャッシュ無効化
  • API レスポンス: TTL 0 (キャッシュしない) または短い TTL
Cache-Control: public, max-age=31536000, immutable  ← 静的アセット
Cache-Control: public, max-age=300                   ← HTML ページ
Cache-Control: no-store                              ← API レスポンス

DNS の TTL

DNS レコードの TTL は、リゾルバがレコードをキャッシュする秒数だ。TTL が長いとキャッシュヒット率が上がるが、レコード変更の反映が遅くなる。

  • 通常運用: 300〜3600 秒
  • 切り替え前: TTL を短く (60 秒) に変更し、反映を待ってから切り替え
  • 切り替え後: 問題なければ TTL を元に戻す

よくある失敗パターン

TTL を設定し忘れる

キャッシュに TTL を設定しないと、古いデータが永遠に返り続ける。「デプロイしたのに変更が反映されない」の原因の大半はキャッシュの TTL 問題だ。

TTL が短すぎる

TTL を 1 秒に設定すると、キャッシュの意味がなくなり、オリジンに負荷が集中する。アクセス頻度とデータの鮮度要件から適切な値を決める。

TTL が長すぎる

TTL を 1 年に設定した HTML ページは、修正をデプロイしてもユーザーに届かない。HTML は短い TTL、静的アセットは長い TTL + ファイル名ハッシュが定石だ。

全体像を把握するには関連書籍も有用。

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

関連用語

関連する記事