キャッシュ
CPUのバスやネットワークなど様々な情報伝達経路において、ある領域から他の領域へ情報を転送する際、その転送遅延を極力隠蔽し転送効率を向上するために考案された記憶階層の実現手段
https://ja.wikipedia.org/wiki/キャッシュ_(コンピュータシステム)
さまざまなレイヤに存在する
Webフロントエンド
フロントエンドエンジニアが知るべきキャッシュを理解する
ブラウザ
インメモリキャッシュ
RAMに保存されるため、書き込みとアクセスが高速
コンピュータの電源がオフになるか、その他の特定の状況で消去される
このインメモリキャッシュは、各ブラウザのRendererプロセスに存在する
ServiceWorker cache
ServiceWorkerはHTTPをinterceptする
Cache Storage APIもしくは、IndexedDBを用いて、リソースのキャッシュを行う
ブラウザキャッシュ
RFC7234で定められているブラウザキャッシュ(=HTTPキャッシュ≒ディスクキャッシュ)
HDDやSSD等のストレージに書き込まれるため、インメモリキャッシュと比較すると読み取りと書き込みが低速
CDN
Fastly, Akamai, CloudFront
サーバサイド
APIサーバのインメモリ
データベース
Memcached, Redisなどのインメモリデータベース
RDBMS
更新パターン
Write-Through
データをキャッシュとバックエンドストレージの両方に同時に書き込む
データの整合性が確保されるが書き込みのレイテンシが増加する可能性がある
Write-Back Caching
データは最初にキャッシュに書き込まれ、後でメインのバックエンドストレージに書き戻される
writeのパフォーマンスが向上するがデータの損失リスクが増加する
Write-Around
この方法では、新しいまたは更新されたデータは直接データストアに書き込まれ、キャッシュは更新されない
データが後で読み出されるときに、キャッシュにロードされる
writeが頻繁に行われるがreadが比較的少ないシステムで有効で、キャッシュの不要な汚染を防げる
Preloading/Warming Up
システムが休止状態の時に、将来的に必要になりそうなデータを予めキャッシュにロードしておく手法
アプリケーションの起動時に変更されない情報を全て取得し、プロセス内に持っておく場合やデプロイ時に作り直すパターンなども該当
Lazy Loading
データが実際に必要になったときのみキャッシュにロードする
データが要求されると、キャッシュに存在しない場合はデータストアから読み込み、キャッシュに保存する
必要のないデータをキャッシュすることを避けられるが初回アクセスは遅くなる
Cache-Aside
アプリケーションまたはデータアクセス層が、キャッシュにデータが存在しないかを確認し、存在しない場合にはデータストアからデータを取得してキャッシュに保存
データの更新はデータストアに直接行い、関連するキャッシュは無効化または更新する
Lazy Loadingの一形態だがより積極的な無効化や更新が行われる
生存期間パターン
Least Recently Used (LRU)
Least Frequently Used (LFU)
First-In-First-Out (FIFO)
Random Replacement (RR)
ランダムにアイテムを選んでキャッシュから削除する
実装が非常にシンプルである一方で、パフォーマンスは最適ではないことが多い
短期的なセッションデータや一過性のイベント情報など、一定時間後には関連性が低くなるデータを定期的に削除するために使われる
Time-To-Live (TTL)
Refresh-Ahead
キャッシュされたデータが特定のイベントの発生時や一定時間の経過など、定期的に自動的に更新する
システムは、データが再度必要になる前に、バックグラウンドでキャッシュを更新する
データの更新パターンが予測可能である場合に有効
Time-To-Refresh (定期更新):
キャッシュされたデータに対して、一定の時間が経過すると自動的に更新を行う
これはRefresh-Aheadと似ているが特定のデータやパターンに基づかず、時間ベースで一律に更新を行う
2023年
「キャッシュは麻薬」という標語からの脱却
キャッシュは麻薬と言われていますが、絶対に避けなければいけないものではありません。整合性が壊れやすくなることが問題なのです。
キャッシュを活用するために必要な知識と勘所
以下の3点を決める必要がある
キャッシュする対象
頻繁にアクセスされるデータ
コストの高い計算結果
キャッシュのアルゴリズム
キャッシュの生存期間