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

キャッシュ更新戦略

Cache Update Strategies

キャッシュとDBをいつ・どう更新するかの4パターン。Cache-aside(遅延読み込み)、Write-through(同期書き込み)、Write-behind(非同期書き込み)、Refresh-ahead(先読み更新)。

キーポイント
  • Cache-aside(lazy loading): アプリが主導。読み取り時にキャッシュを見て、なければDBから読んでキャッシュに入れる。最も一般的。
  • Write-through: 書き込み時、キャッシュ経由で同期的にDBへ書く。データは常に最新だが書き込みが遅い。
  • Write-behind(write-back): キャッシュに書いたら即返し、DBへは非同期で書く。書き込みが速いが障害時にデータ損失のリスク。
  • Refresh-ahead: 期限切れ前に、よくアクセスされるエントリを先回りで更新。予測が当たればレイテンシ低減。
  • Cache-asideの短所: cache missで3往復(遅延)。Write-behindの短所: DB到達前の障害でデータ損失。
トレードオフ

Cache-asideはシンプルで一般的だが、ミス時に遅く、更新時にキャッシュが古くなりうる。Write-throughは常に最新を保てるが書き込みが遅い。Write-behindは書き込みが速いが、DBに届く前に落ちるとデータが消える。Refresh-aheadは予測が当たれば速いが、外れると無駄な更新で逆に性能が落ちる。『読み取り重視か書き込み重視か』『多少の古さやデータ損失を許せるか』で選ぶ。

4戦略の早見

戦略読み取り書き込み最大の弱点
Cache-asideアプリがmiss時にDBから読むアプリがDBに書くmiss時に3往復で遅い
Write-throughキャッシュから読む同期でDBへ書く書き込みが遅い
Write-behindキャッシュから読む非同期でDBへ書く障害でデータ損失
Refresh-ahead先読みで温めておく(読み取り最適化)予測外れで無駄

① Cache-aside(遅延読み込み)— 最も一般的

アプリが司令塔。キャッシュはDBと直接やり取りしません。

図を描画中...

読みに行ってなければDBから取り、キャッシュに入れて返す。実際に要求されたデータだけキャッシュされるので無駄がない。Memcachedでよく使われます。

  • 短所『3往復』: ミス時は『キャッシュ探索 → DBロード → キャッシュ追加』の3ステップで遅い。
  • 短所: DBを直接更新するとキャッシュが古くなる(TTLやwrite-throughで緩和)。

② Write-through(書き込み貫通)

アプリはキャッシュを主データストアとして扱い、書き込み時にキャッシュが同期的にDBへ書きます

図を描画中...

キャッシュとDBが常に一致するので古くならない。ただし毎回DBへの書き込み完了を待つので書き込みが遅い。また、書いたデータの多くは読まれないこともある(TTLで緩和)。

③ Write-behind(書き戻し)

キャッシュに書いたら即座に完了を返し、DBへは後から非同期で書きます。

図を描画中...

書き込みが爆速になります。ただしDBに届く前にキャッシュが落ちるとデータが消える(重大リスク)。実装もcache-aside/write-throughより複雑。

④ Refresh-ahead(先読み)

期限が切れる前に、よくアクセスされるエントリを先回りで自動更新しておきます。

図を描画中...

予測が当たれば、ユーザーがアクセスしたときには既に新鮮なデータがある(待ち時間ゼロ)。ただし予測が外れると、使われないデータを無駄に更新して逆に性能が落ちます。

つまずきポイント

  • どれが正解かは『読み取り重視 or 書き込み重視』『古さやデータ損失をどこまで許せるか』で決まる。万能はない。
  • 迷ったらまずCache-aside(最も一般的で素直)。書き込み整合性が重要ならWrite-through、書き込み速度が命でデータ損失を許せるならWrite-behind。
  • Write-behindの『データ損失リスク』は見落としがち。お金など失ってはいけないデータには使わない。

関連する概念

この概念で腕試し

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

クイズを解く