👻

キャッシュの状態

に公開

キャッシュは、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