最終更新:

【仕組み解説】キャッシュはなぜ速い? — データの再利用・有効期限・更新を図解


「保存してある」と「使える」は別 コピーはある? そのまま使える? HTTPキャッシュでは鮮度と応答の指示を確認 再利用できる 再確認が必要 保存した応答を使う 本体の通信を省く 条件付きで問い合わせ ETagなどで変更を確認 変更なしなら304 保存した本文を再利用 コピーがなければ取得 保存できる応答を保持 no-cache:再利用前に確認 no-store:その応答を保存しない
HTTPキャッシュの概略。再検証で変更があれば新しい本文を受け取ります。304でも問い合わせの通信は発生します。
ひよこ ひよこ
同じサイトを2回目に開くと速いのは、前の画面を覚えているから?
ペンギン先生 ペンギン先生
理由の一つはキャッシュだよ。画像やCSS、処理の結果などを保存し、次に必要になったとき再利用するんだ。よく使う資料を手元に置いて、毎回探しに行かずに済ませるイメージだね。ただし二回目なら必ず速いわけではなく、何が再利用できるかで変わるよ。
ひよこ ひよこ
どこに保存しているの?自分のパソコンの中だけ?
ペンギン先生 ペンギン先生
ブラウザのキャッシュは端末側、CDNのキャッシュは配信サーバー側にあるよ。アプリがRedisなどに計算結果やDBから取得したデータを保存する場合もあるんだ。共通するのは、毎回の通信や処理を省くこと。ただし保存場所も、いつ更新するかのルールも同じではないよ。
ひよこ ひよこ
キャッシュにあれば、そのまま使っていいの?
ペンギン先生 ペンギン先生
使えるコピーが見つかるとヒット、見つからないとミスと呼ぶよ。HTTPのキャッシュでは、保存されているだけでなく、まだ新鮮とみなせるか、再確認が必要かも判断するんだ。たとえばmax-ageは鮮度の期間を指定する。これはその期間ずっと必ず保存する約束ではなく、容量の都合などで消えることもあるよ。
ひよこ ひよこ
期限が来たら、また画像を丸ごとダウンロードするの?
ペンギン先生 ペンギン先生
変更の有無だけを確かめられる場合があるよ。ETagという内容の版を区別する値を受け取っていれば、If-None-Matchでその値を送り、変わっていないか問い合わせる。変更がなければ304 Not Modifiedが返り、手元の本文を再利用できるんだ。通信そのものがゼロになるのではなく、大きな本文の再転送を省けるんだね。
ひよこ ひよこ
ETagって、ファイルのハッシュ値のこと?
ペンギン先生 ペンギン先生
ハッシュを使う実装もあるけれど、必ずそうとは限らないよ。版番号などでもよく、生成方法は一つに決められていないんだ。クライアントは値の意味を推測するより、サーバーから受け取った識別子として扱うよ。
ひよこ ひよこ
no-cacheって指定すれば、コピーを保存しないんだよね?
ペンギン先生 ペンギン先生
名前が紛らわしいけれど違うよ。no-cacheは、保存した応答を別の要求に再利用する前に確認する指示。保存を禁止したいならno-storeなんだ。privateはブラウザのような専用キャッシュへの保存を認めつつ、CDNなどの共有キャッシュへの保存を禁止する。目的に合わせて区別しよう。
ひよこ ひよこ
アプリが商品データをキャッシュしていたら、価格変更はどう反映するの?
ペンギン先生 ペンギン先生
アプリ側で更新のルールを作るよ。たとえばDBを更新した後に該当するキャッシュを無効にし、次の読み取りで入れ直す方法がある。ただし同時アクセスなどで古い情報が残る可能性もあるんだ。期限を付けるだけで常に最新になるとは限らないので、在庫確定など正確さが必要な処理では元データをどう確認するかまで考えるよ。
ひよこ ひよこ
ヒット率を100%に近づければ成功?
ペンギン先生 ペンギン先生
率だけでは決められないよ。100回の対象要求のうち90回ヒットなら90%だけれど、小さな画像と重い処理では一回省く効果が違うんだ。応答時間、転送量、元のサーバーの負荷、情報の古さを合わせて見る。大量の期限切れが重なった場合や、キャッシュ障害で元の処理へ集中する場合も考えておこう。

HTTPキャッシュの指示を読み分ける

応答のCache-Control基本的な意味
max-age=3600応答の経過時間が3600秒未満なら新鮮とみなす。ほかの条件も適用される
no-cache保存は禁止しないが、別の要求への再利用前に検証する
no-storeその応答を保存しない
private共有キャッシュに保存しない。専用キャッシュは保存できる

no-storeを後から返しても、過去に保存されたコピーを一括で消す命令にはなりません。また、ブラウザの「戻る」で画面を復元する仕組みはHTTPキャッシュと同じではありません。

CSSやJavaScriptは、内容が変わったらstyle.a1b2c3.cssのようなファイル名も変える方法があります。新しいHTMLが新しい名前を参照すれば、古いファイルとの混同を防ぎやすくなります。HTML側の更新方針もセットで設計します。

この記事はウェブ配信とアプリのキャッシュが対象です。CPUキャッシュの具体的な容量・遅延や、製品間の性能比較を示すものではありません。

次に読む:CDNの配信と更新。

参考資料

確認日:2026年9月21日。

  • RFC 9111 — HTTP Caching — 鮮度、再検証、304応答、private・no-cache・no-storeの違い。
  • MDN — HTTP caching — ブラウザと共有キャッシュ、Cache-Control、再検証とファイル名のバージョニング。
  • MDN — ETag header — ETagは生成方法を限定しない識別子で、ハッシュだけでなく版番号なども使えること。
  • Microsoft — Cache-Aside pattern — アプリがキャッシュと元データを扱う流れ、更新・失効・整合性の課題。

訂正履歴

  • 2026-09-21:条件のない速度・容量・ヒット率の目安、ETagは必ずハッシュという説明、DBは常にディスクを読むという断定を修正。