SDN
← 概念一覧へ
キャッシュ

キャッシュの概要

Caching Overview

よく使うデータを高速な場所(主にメモリ)に一時保存し、毎回元(DB)に取りに行かずに済ませる仕組み。表示を速くし、DB負荷を下げ、トラフィックの波を吸収する。

キャッシュヒット率と平均レイテンシ

ヒット時 1ms・ミス時 100ms と仮定した実効レイテンシ(= ヒット率×ヒット時 + ミス率×ミス時)。ヒット率が高いほど平均が急激に下がります。

※ 値は絶対値ではなく「傾向を示す例示」です。相対的な大小関係を読み取るためのものです。

キーポイント
  • 目的: ページロードを速くし、サーバー/DBの負荷を軽減する。DBの前に置いて、不均一な負荷やスパイクを吸収する。
  • 速い理由: メモリ(RAM)はディスクより桁違いに速い。よく読むデータをメモリに置けば、DBへのアクセスを減らせる。
  • 代表ツール: Memcached / Redis(インメモリのキー・バリューストア)。
  • 最大の難しさは『キャッシュ無効化(cache invalidation)』= 元データが変わったとき、いつ古いキャッシュを捨てるか。
トレードオフ

キャッシュは劇的に速くなる強力な手段だが、『真実の源(DB)』とキャッシュの間で整合性を保つ必要がある。元データが更新されたのにキャッシュが古いままだと、ユーザーに古い情報を見せてしまう。『いつキャッシュを更新/破棄するか』は難問で、有名な格言『コンピュータサイエンスの2大難問はキャッシュ無効化と命名』がある。導入にはアプリ改修も要る。

たとえ話: 机の上のメモ

調べ物をするたびに毎回図書館(=DB、遅い)へ行くのは大変です。そこでよく使う情報を手元のメモ(=キャッシュ、速い)に書き写しておく。次からはメモを見るだけで済み、図書館へ行く回数が激減します。

これがキャッシュの本質。よく使うデータを、近くて速い場所にコピーしておくことで、遅い元データへのアクセスを減らします。

図を描画中...

なぜそんなに速くなるのか

メモリ(RAM)はディスクより圧倒的に速いからです。System Design Primerのレイテンシ数値より:

  • メモリから1MB連続読み取り ≒ 250マイクロ秒
  • SSDから1MB ≒ 1,000マイクロ秒(メモリの4倍遅い)
  • HDDシーク ≒ 10,000マイクロ秒(メモリの40倍遅い)

つまりDBがディスクを叩くところを、メモリのキャッシュで返せれば数倍〜数十倍速くなります。さらにDB自体の負荷も減るので一石二鳥。

トラフィックの波を吸収する

キャッシュはDBの『盾』にもなります。アクセスが急増(スパイク)しても、その大半をキャッシュが受け止めれば、DBには一部しか届きません。これで不均一な負荷を平滑化できます。

最大の難問: キャッシュ無効化

キャッシュの便利さの裏には、永遠の課題があります。

元データ(DB)が変わったとき、コピー(キャッシュ)も更新しないと、古い情報を見せてしまう。

『いつ』『どうやって』古いキャッシュを捨てる/更新するかは難しく、これが次の『キャッシュ更新戦略』の主題です。

つまずきポイント

  • キャッシュは『速くなる魔法』だが、整合性という代償がある。古いキャッシュ(stale)を返す事故は典型的なバグ。
  • file-basedキャッシュ(ファイルに保存)は、サーバーを複製・オートスケールしづらくするので避け、Redis/Memcachedのような共有メモリストアを使うのが定石。

📊 図解

図解: キャッシュヒット / ミスの流れ

まずキャッシュを見て、あれば即返す(hit)。無ければ(miss)DBから取得し、次回のためにキャッシュへ保存する。miss の経路だけがDBに到達する点が、DB負荷軽減の本質。

図を描画中...

関連する概念

この概念で腕試し

関連する 0 問のクイズに挑戦できます。

クイズを解く