👻
キャッシュの状態
キャッシュは、TTLと呼ばれる有効期限が切れたら即使えなくなるわけじゃない
freshかstaleか
キャッシュには二つの状態がある
状態 | 有効期限 (TTL) | サーバー問い合わせ | キャッシュの扱い |
---|---|---|---|
Fresh | TTL内(期限切れ前) | 不要 | そのまま利用 |
Stale | TTL切れ(期限超過) | 必要(ETag / Last-Modified で再検証) | 304なら再利用、更新あれば新キャッシュ取得 |
staleの時どうするか
freshの時は基本的にそのままキャッシュの値が使われるだけだけど、
staleの時にどういう扱いをするのかはcache-controlのディレクティブで指定できる
ディレクティブ / ヘッダー | 対象 | 役割 |
---|---|---|
stale-while-revalidate |
ブラウザ & プロキシ | 期限切れキャッシュを即返しつつ、裏で更新を取りに行く |
stale-if-error |
ブラウザ & プロキシ | オリジン取得がエラー(5xxやネットワーク失敗)の場合、期限切れキャッシュを返す |
サンプル
Cache-Control: max-age=60, stale-while-revalidate=300
max-age=60 → 60秒間効く
stale-while-revalidate=300 → TTL切れのあと、300秒は裏で更新しつつ即返却
キャッシュの更新方法の指定
検証のタイミングも指定できる
ディレクティブ | 対象 | 役割 |
---|---|---|
must-revalidate |
ブラウザ & プロキシ | 有効期限切れキャッシュは必ず再検証 |
proxy-revalidate |
プロキシのみ | 共有キャッシュは必ず再検証、ブラウザは対象外 |
immutable |
ブラウザ | 有効期限内は再検証を絶対にしない(変更されない前提のリソース用) |
サンプル
Cache-Control: max-age=60, must-revalidate
TTL(Fresh期間) = 60秒
TTL切れのあとは必ずオリジンに再検証
no-cache
no-cacheは「キャッシュをしないで」という指定じゃなくて、必ず毎回再検証してねっていう指定
検証してレスポンスが変更されてなければキャッシュの値を再利用できる
Discussion