キャッシュ

要点

  • キャッシュとは、一度取得したデータを一時的に保存し、次回以降は再利用する仕組みです。
  • ブラウザ・CDN・リバースプロキシ・アプリケーションなど、リクエストの経路上の複数の場所で使われています。
  • 表示速度の向上やサーバー負荷の軽減だけでなく、SEOやコンバージョン率にも影響する重要な仕組みです。
  • Cloudflare・Redis・Varnishなど、実務でよく使われる代表的なソリューションが数多く存在します。
  • 個人情報を含むデータやリアルタイム性が求められるデータなど、キャッシュに向かないものもあり、設定を誤ると事故につながります。

キャッシュとは何か

キャッシュは、一度サーバーから取得したデータのコピーを手元(ブラウザや中継地点)に一時保存しておき、同じデータが必要になったときに再利用する仕組みです。

毎回サーバーまで取りに行かなくて済むため、表示が速くなり、サーバー側の負荷も減らせます。

ぽち先生のヒント冷蔵庫のストックに似ているよ。よく使う調味料をいちいち買いに行く(サーバーに問い合わせる)のではなく、あらかじめ冷蔵庫に入れておけば(キャッシュに保存)、必要なときすぐに取り出せるんだ。

キャッシュの種類①:ブラウザキャッシュとCDNキャッシュ

キャッシュは1か所だけで使われるわけではなく、利用者の端末からサーバーの奥まで、経路上のいくつもの場所に存在します。まずは利用者に近い、身近な2つの層から見ていきましょう。

🖥️ ブラウザキャッシュ 利用者の端末に保存 同じ人の再訪問で効く
🌐 CDNキャッシュ 世界各地の配信拠点に保存 誰がアクセスしても効く

ぽち先生のヒントブラウザキャッシュは「自分の冷蔵庫のストック」、CDNキャッシュは「近所にあるコンビニの在庫」のようなものだよ。自分の冷蔵庫は自分しか使えないけど、近所のコンビニなら誰が行っても同じ商品をすぐ受け取れるんだ。

キャッシュの種類②:サーバー側のキャッシュ

キャッシュは、利用者に近いブラウザやCDNだけでなく、サーバー側にも複数の層があります。リクエストの手前で処理を打ち切って応答を返せる場所が多いほど、奥にあるアプリケーションやデータベースの負荷を減らせます。

クライアント
CDN
リバースプロキシ
キャッシュ
アプリ/DB
🚪 リバースプロキシキャッシュ アプリケーションサーバーの手前に置き、同じリクエストへの応答を代わりに返す 例: Varnish、Nginxのプロキシキャッシュ機能
🗄️ アプリケーション(データ)キャッシュ データベースへの問い合わせ結果や、重い計算処理の結果を一時保存 例: Redis、Memcachedなどのインメモリストア

ぽち先生のヒント会社の受付のようなものだよ。よくある質問なら受付だけで答えられて、奥の担当者(データベース)まで取り次がずに済むよね。取り次ぐ回数が減るほど、担当者の負担も軽くなるんだ。

初回リクエストとキャッシュヒットの違い

初めてアクセスするときはサーバーまでデータを取りに行きますが、2回目以降はキャッシュに保存された分をそのまま使う(これを「キャッシュヒット」と呼びます)ため、通信そのものが不要になることもあります。

1回目:
サーバーへ取得しに行く
手元に保存
2回目以降:
保存分を再利用
初回アクセスサーバーと通信。時間がかかる。
キャッシュヒット手元のデータを利用。表示が高速。

Cache-Controlヘッダー

サーバーは、レスポンスに「Cache-Control」というヘッダーを付けることで、「このデータをどれくらいの期間キャッシュしてよいか」をブラウザやCDNに指示できます。

max-age=36001時間はキャッシュを再利用してよい。
no-cache毎回サーバーに確認してから使う。
no-storeそもそもキャッシュに保存しない。

画像やCSSのように更新頻度が低いファイルは長めにキャッシュし、頻繁に変わる情報は短めに、または保存しない、といった使い分けが行われます。

キャッシュの用途

キャッシュは、単にページの表示を速くするだけでなく、様々な目的で活用されています。

🚀 ページ表示の高速化 表示速度は、検索順位にも関わるCore Web Vitalsの評価項目であり、離脱率やコンバージョン率にも直結する
💾 API・データベースの負荷軽減 同じ問い合わせ結果を使い回すことで、サーバーやデータベースへの負荷を減らす
🎬 動画・画像配信の最適化 容量の大きいメディアファイルをCDNでキャッシュし、遅延なく配信する
📴 オフライン対応 Service Worker(PWA)がキャッシュしたコンテンツを使い、電波が不安定な環境でも表示できるようにする

身近なキャッシュソリューション

キャッシュの各層には、実務でよく使われる代表的な製品・サービスがあります。

🌐 CDNサービス Cloudflare、Amazon CloudFront、Akamai、Fastlyなど
🚪 リバースプロキシ Varnish、Nginxなど
⚡ インメモリキャッシュ Redis、Memcachedなど
🔌 CMS向けキャッシュプラグイン WordPressの「WP Rocket」「W3 Total Cache」など

これらのソリューションは、キャッシュ期間の設定や、更新時にキャッシュを無効化する仕組みをまとめて管理できるように作られています。

キャッシュに向くデータ・向かないデータ

キャッシュは万能ではありません。データの性質によって、向くもの・向かないものがあります。

✅ キャッシュに向くデータ 全利用者に共通する静的なコンテンツ(画像・CSS・JSファイルなど) 更新頻度が低いデータ(商品カタログ、記事本文など) 計算コストが高く、毎回同じ結果になる処理(集計結果など)
🚫 キャッシュに向かないデータ 個人情報を含むレスポンス(マイページ、注文履歴、残高照会など) リアルタイム性が求められるデータ(在庫数、価格、チャットなど) POST・PUT・DELETEのような、副作用を伴うリクエスト(そもそもキャッシュの対象外)

キャッシュ利用時の注意点

便利なキャッシュですが、設定を誤ると思わぬトラブルにつながります。代表的なリスクは次のとおりです。

個人情報の混入事故private指定を忘れると、本来は本人だけに見せるべき画面が、別の利用者に配信されてしまう。
対策:Cache-Control: private/no-store個人情報を含むレスポンスには必ず指定する。
キャッシュポイズニング不正な入力によって誤った内容がキャッシュされ、以降の利用者全員に配信されてしまう。
対策:入力値の検証とキャッシュキーの限定信頼できるヘッダー・パラメータだけをキャッシュの判定に使う。
キャッシュスタンピード人気コンテンツのキャッシュが期限切れになった瞬間、大量のリクエストがサーバーに殺到する現象。
対策:ロックや有効期限のずらし(jitter)再生成中は既存のキャッシュを使い続けたり、期限切れのタイミングを少しずつ分散させる。

ぽち先生のヒント「向かないデータ」を誤ってキャッシュしてしまうと、ある人向けの注文内容を、別のお客さんに渡してしまうようなことが起きかねないんだ。何をキャッシュしてよいかは、慎重に見極める必要があるんだよ。

「更新が反映されない」問題とその対策

キャッシュには「サーバー側のデータを更新したのに、古い内容が表示され続ける」という、よくある問題がつきものです。

これは、ブラウザやCDNが「まだキャッシュの期限内だから」と判断し、サーバーへ確認しに行かないために起こります。開発時に「コードを直したのに反映されない」と感じたら、まずキャッシュを疑ってみるとよいでしょう。

ぽち先生のヒントよく行く店の「顔パス」に似ているよ。店員があなたを覚えていて「いつものやつですね」と出してくれるのは便利だけど、実は好みが変わっていた場合、店員がそれに気づかず古い注文のまま出してしまうことがあるんだ。

この問題への対策としては、ファイル名にバージョンやハッシュ値を含める「キャッシュバスティング」(例: style.abc123.css)や、CDN側で古いキャッシュを強制的に削除する「パージ」操作がよく使われます。

まとめ

キャッシュは、一度取得したデータを再利用することで表示速度とサーバー負荷を改善する仕組みです。ブラウザ・CDNだけでなく、リバースプロキシやアプリケーション層など、リクエストの経路上の複数の層で使われており、Cloudflare・Varnish・Redisといった代表的なソリューションがあります。ただし万能ではなく、個人情報を含むデータやリアルタイム性が求められるデータはキャッシュに不向きです。ページ表示速度はSEOやコンバージョン率にも影響する一方、更新の反映漏れやキャッシュポイズニングといったリスクへの目配りも欠かせません。

関連トピック:

🏠 トップに戻る