$30 off During Our Annual Pro Sale. View Details »

キャッシュと向き合う、キャッシュと共に生きる / cache pattern

キャッシュと向き合う、キャッシュと共に生きる / cache pattern

soudai sone

March 02, 2024
Tweet

More Decks by soudai sone

Other Decks in Technology

Transcript

  1. 自己紹介
 曽根 壮大(39歳)
 Have Fun Tech LLC 代表社員
 株式会社リンケージ CTO


    
 そ
 • 日本PostgreSQLユーザ会 勉強会分科会 担当
 • 3人の子供がいます(長女、次女、長男)
 • 技術的にはWeb/LL言語/RDBMSが好きです
 • コミュニティが好き たけ
 ね
 とも

  2. データベース アプリケーション キャッシュ データA データA データB データが更新 キャッシュと データが不意一致 データベース

    アプリケーション キャッシュ データA データA データA 保存先が必要 データベースから取り出すよりも高速 同時に複数のリクエストを処理できる データA データB
  3. データベース アプリケーション キャッシュ データA データA データB データが更新 キャッシュ キャッシュ キャッシュ

    データ クラッシュ データB データA キャッシュが多段だとデータの状態がわかりにくい 一見するとここがおかしいように見えて、実は前段の キャッシュが壊れているのが原因 キャッシュが 1箇所であれば、確認する場所が明白
  4. • Write-Through(ライトスルー)
 • Write-Back Caching(ライトバックキャッシング)
 • Write-Around(ライトアラウンド)
 • Preloading/Warming Up


    (ペイローディング/ウォーミングアップ)
 • Lazy Loading(レイジーロード)
 データ更新のアルゴリズム
  5. データベース 読み込み キャッシュ データ更新を両方 同時に行う データはキャッシュから参照する Write-Through 書き込み データA データA

    キャッシュとデータベース両方同時書き込みをするため、 書き込みのコストは2倍だが、データの同期は即時に必ず行われる
  6. データベース 読み込み キャッシュ 1. データ更新をキャッシュ側に行う データはキャッシュから参照する Write-Back Caching 書き込み データA

    データA データをキャッシュ側にまず行うため、データ変更の参照は即時に反映される。 キャッシュからデータベースに同期されるまでにタイムラグがあり、 その間にキャッシュのサーバが壊れるとデータロストにつながる 2. キャッシュからデータベースに書き込む
  7. データベース 読み込み キャッシュ 4. 次回以降キャッシュから参照する Write-Around 書き込み データA データA データベースに最初に保存するため、データのロストの可能性がない

    データがUPDATE時にキャッシュ側のデータを削除する仕組みがないと、データの不整 合が発生する可能性がある。 前述の2つと違い、不要なキャッシュを作らない反面、初回の読み込みが遅い 1.データ更新をデータベースに行う 2. 初回はデータベースから参照する 3.初回の読み込みの際にデータベース から読み出してキャッシュに保存する
  8. データベース 読み込み キャッシュ 起動時などに事前にキャッシュにロードする データはキャッシュから参照する Preloading/Warming Up データA データA コンフィグなどの変更されないデータは相性が良い

    サーバの起動時、デプロイ、日次バッチなどで事前にロードする仕組み全般 設定変更の際にリセットする仕組みがないと再起動が必要になったりする
  9. 読み込み キャッシュ データはキャッシュから参照する Lazy Loading 書き込み データA データA データベースにデータを更新して、参照時にキャッシュにデータがなければ キャッシュを生成してからデータをキャッシュから読み出す

    Write-Aroundと同様の特徴があり、亜種とも言える 2. データが無ければデータベースから キャッシュに書き込む データベース 1.データ更新をデータベースに行う
  10. • 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
 生存期間のアルゴリズム
  11. データベース アプリケーション Least Recently Used (LRU) データA データB 削除のイベント時に最も最後に使われたデータを削除する 過去に沢山使ったデータだとしても、使っていないデータから消される

    最近のデータだとしても、使われていないと消される データA データA データC データB データC キャッシュ生成 データC データD キャッシュ データD 最近使った 最後に使われたデータ よく使う
  12. データベース アプリケーション Least Frequently Used (LFU) データA データB 削除のイベント時に最も使われていないデータを削除する 最近のデータだとしても、利用頻度が少ないデータは削除する

    期間を決めないと最近は使っていないが過去にすごく使われたデータが残る データA データA データC データB データC キャッシュ生成 データC データD キャッシュ データD たまにつかう 使われていないデータ よく使う
  13. キャッシュ データベース アプリケーション First-In-First-Out (FIFO) データA データB 削除のイベント時に作られた順に削除する 利用頻度や直近の利用を考慮しない 新しいキャッシュデータが使われやすい場合に有効

    よく使われていても消す 短い期間しか使われないデータやBatchの一時データのようなキャッシュで有効 データA データA データC データB データC データD データD データC 最近使った よく使う 1 2 3 4 キャッシュ生成順 最初に生成されたの で消す
  14. キャッシュ データベース アプリケーション Refresh-Ahead データB 削除のイベント時にキャッシュをパターンにマッチした対象を削除する Write-AroundやLazy Loadingを採用している場合に、古くなったデータを定期的に全て消す場合などで 利用する。 Preloading/Warming

    Upは生成前に全て作り直すことが多いのでRefresh-Aheadになりやすい データA データA データC データB データC データD データD データC 最近使った よく使う データA キャッシュ生成 特定の条件に マッチすると消す
  15. キャッシュ データベース アプリケーション Time-To-Refresh データB 削除のイベント時に対象を削除する Refresh-Aheadの亜種。 Write-AroundやLazy Loadingを採用している場合に、古くなったデータを定期的に消す場合などで利用 する。

    TTLを設定しておき、1時間に一回確認して有効期限切れのキャッシュを消す場合などが該当する データA データA データC データB データC データD データD データC 最近使った よく使う データA キャッシュ生成 定期的に消す