中級では戦略と無効化を見ました。上級では、一貫性・スタンピード・分散の内部へ。
概要 — まず全体をつかむ
詳細 — 1段階ずつ追う
書き込みと一貫性のモデル
キャッシュとDBの食い違いを、どう抑えるか。
- write-through — 書き込み時にキャッシュとDBを同時更新(一貫だが書きが重い)
- write-back — 先にキャッシュ、あとでDB(速いが喪失リスク)
- write-around+cache-aside — 書きはDBへ、読みでキャッシュに載せる(王道)
- 順序 — 更新は「DB更新→キャッシュ削除」が基本。削除でなく更新にすると競合で古い値が残りやすい
やさしく言うと(中級)
多くはインメモリ(Redis・Memcached など)で、メモリ上に持つので非常に速い。設計は「何を・いつ載せ・いつ捨てるか」が肝です。
- TTL — 一定時間で自動的に捨てる
- 無効化(invalidation) — 元データが変わったら、古いキャッシュを消す/更新する
- キー設計 — 何を鍵にするか(細かすぎるとhitしない、粗すぎると混ざる)
登場人物メモ:
- ※1 cache-aside — アプリがキャッシュを見て、missならDB→書き戻す王道
- ※2 stale-while-revalidate — 古い値を返しつつ、裏で新しい値に更新する
アニメーション『キャッシュ ヒット/ミスの分岐』を開く
ミスの嵐をどう防ぐ
- TTL+ジッタ — 期限を散らし、一斉失効を避ける
- single-flight — 同一キーの再計算を1本に集約
- stale-while-revalidate — 古い値を返しつつ裏で更新
- negative caching — 「無い」という結果も短くキャッシュ(無駄な問い合わせ抑制)
やさしく言うと(中級)
アニメーション『キャッシュの読み込み(cache-aside)』を開く
- アプリ — データが欲しい側。まずキャッシュを見にいく
- キャッシュ — Redis 等の高速な一時置き場。あれば即返せる
- DB — 本物のデータ源。確実だが読み込みは遅い
0 / 6
- アプリがキャッシュを確認(hit なら即返す)
- miss なら DB から取得
- 取得値をキャッシュに書き(TTL付き)、返す
- 元データを更新した時に、該当キャッシュを無効化 or 上書きする
分散とアルゴリズム
- eviction — LRU/LFU/W-TinyLFU/ARC。ヒット率と実装コストのバランス
- コンシステントハッシュ — ノード増減で動く鍵を最小化。仮想ノードで平準化
- near cache — アプリ内の1次キャッシュ+共有の2次キャッシュ(多層)
- ホットキー — 1つの鍵に集中。複製やローカル化で分散
やさしく言うと(中級)
「キャッシュの無効化はコンピュータサイエンスの難問の一つ」と言われます。
- 整合性 vs 速さ — 古い値(stale)を許すほど速いが、正しさは落ちる
- 書き込み方式 — write-through(同時に書く)/write-back(後で書く)など
- スタンピード対策 — TTLをばらす、再計算をロックで1本化、stale-while-revalidate
- 分散キャッシュ — 複数ノードで共有(Redisクラスタ等)。ノード配置と一貫性が課題
⚠️ 破れ方
- スタンピード — 一斉ミスでDB殺到(上の対策で緩和)
- 整合性の破れ — 更新とキャッシュ削除の競合で古い値が固定される
- キャッシュ汚染 — 個人向け応答を共有キャッシュへ載せる事故
- メモリ圧迫 — evictionで必要なものまで押し出される(サイズ設計)
やさしく言うと(中級)
- stale(古い値) — 無効化漏れで、更新が反映されない
- キャッシュスタンピード — 一斉missでDBへ集中
- メモリ溢れ — 容量超過で古いものが押し出される(eviction)。何が消えるかを理解して設計する
理解度チェック
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. 期限切れでも古い値をいったん返しつつ、裏側で新しい値へ更新する手法を、英字(ハイフン区切りの語)で答えてください。
問2. 人気キーの一斉ミスでDBへ殺到するのを、1件だけ再計算させて防ぐ手法は?
問3. 分散キャッシュでノードの増減時に「移動する鍵を最小化」する仕組みは?
問4. write-back(遅延書き戻し)方式の説明として正しいのは?
問5. 元データ更新時に「キャッシュを上書き更新」ではなく「DB更新→キャッシュ削除」が基本とされるのはなぜ?
問6. 「存在しない」という結果も短時間キャッシュする negative caching の主な狙いは?
問7. 1つの鍵にアクセスが集中する「ホットキー」への対処として適切なのは?
問8. キャッシュ容量が満杯のとき、どの項目を追い出すかを決める処理(LRUやLFUなどの方針)の総称を英単語で答えてください。