同じ問い合わせを何度もDBに投げるのは、毎回分厚い辞書を引くようなもの。よく使う答えは手元にメモしておこう——それがキャッシュです。
概要 — まず全体をつかむ
詳細 — 1段階ずつ追う
これは何をする係?
よく引く単語を付箋に書いておけば、毎回辞書(※1 DB)を引かずに済みます。キャッシュはこの付箋。よく使う答えを手元に置き、DBまで行かずに速く返す係です。
ポイントは、キャッシュの中身は消えてもよいこと。無ければDBに取りに行けばいいので、あくまで「近道」です。
登場人物メモ:
- ※1 DB — 大元の正しいデータの置き場(辞書)
- ※2 hit/miss — 手元にある(hit)/無くてDBへ(miss)
この部分をもっと深く(中級)
多くはインメモリ(Redis・Memcached など)で、メモリ上に持つので非常に速い。設計は「何を・いつ載せ・いつ捨てるか」が肝です。
- TTL — 一定時間で自動的に捨てる
- 無効化(invalidation) — 元データが変わったら、古いキャッシュを消す/更新する
- キー設計 — 何を鍵にするか(細かすぎるとhitしない、粗すぎると混ざる)
登場人物メモ:
- ※1 cache-aside — アプリがキャッシュを見て、missならDB→書き戻す王道
- ※2 stale-while-revalidate — 古い値を返しつつ、裏で新しい値に更新する
アニメーション『キャッシュ ヒット/ミスの分岐』を開く
仕事の流れ
- バックエンドが「この答えある?」とキャッシュに聞く
- あれば即返す(hit・速い)
- 無ければDBに取りに行き(miss)、その答えをキャッシュに置いてから返す
- 次からは、同じ問い合わせはキャッシュから即返せる
この部分をもっと深く(中級)
アニメーション『キャッシュの読み込み(cache-aside)』を開く
- アプリ — データが欲しい側。まずキャッシュを見にいく
- キャッシュ — Redis 等の高速な一時置き場。あれば即返せる
- DB — 本物のデータ源。確実だが読み込みは遅い
0 / 6
- アプリがキャッシュを確認(hit なら即返す)
- miss なら DB から取得
- 取得値をキャッシュに書き(TTL付き)、返す
- 元データを更新した時に、該当キャッシュを無効化 or 上書きする
CDNとの違い
名前が似ていますが役割が違います。
- CDN — “配信”の近道。画像など変わらないものを、利用者の近くから配る
- キャッシュ — “処理”の近道。よく使う答えを手元に置き、DB往復を減らす
どちらも「速くするための、消えてよい控え」という点は共通です。
この部分をもっと深く(中級)
「キャッシュの無効化はコンピュータサイエンスの難問の一つ」と言われます。
- 整合性 vs 速さ — 古い値(stale)を許すほど速いが、正しさは落ちる
- 書き込み方式 — write-through(同時に書く)/write-back(後で書く)など
- スタンピード対策 — TTLをばらす、再計算をロックで1本化、stale-while-revalidate
- 分散キャッシュ — 複数ノードで共有(Redisクラスタ等)。ノード配置と一貫性が課題
⚠️ うまくいかないとき
- 古い値が残る — 元データが変わったのに、古いメモを返してしまう(無効化が要る)
- キャッシュが飛ぶとDB殺到 — 一斉にmissが起きて、DBに問い合わせが集中する
この部分をもっと深く(中級)
- stale(古い値) — 無効化漏れで、更新が反映されない
- キャッシュスタンピード — 一斉missでDBへ集中
- メモリ溢れ — 容量超過で古いものが押し出される(eviction)。何が消えるかを理解して設計する
理解度チェック
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. CDNと(アプリの)キャッシュの違いとして正しいのは?
問2. (アプリの)キャッシュの狙いに最も近いのは?
問3. キャッシュに答えがあって、そのまま返せる状態を何という?
問4. キャッシュに答えが無い(miss)とき、バックエンドはどうする?
問5. キャッシュの中身について正しいのは?
問6. 元データが更新されたのに、キャッシュが古いメモを返してしまう問題を防ぐには何が要る?
問7. 大元の正しいデータの置き場(辞書にたとえた原本)を指す略語を、英字2文字で答えてください。
問8. キャッシュに答えが無く、DBまで取りに行くことを英語で何という?