Slide 1

Slide 1 text

キャッシュと向き合う キャッシュと共に生きる PHPerKaigi 2024

Slide 2

Slide 2 text

キャッシュの自体の説明はありません
 
 ※注意事項
 What is it?

Slide 3

Slide 3 text

併せて読むと良い
 
 
 What is it?

Slide 4

Slide 4 text

https://speakerdeck.com/moznion/pattern-and-strategy-of-web-application-caching

Slide 5

Slide 5 text

https://soudai.hatenablog.com/entry/cache-strategy

Slide 6

Slide 6 text

キャッシュは麻薬
 
 
 What is it?

Slide 7

Slide 7 text

キャッシュは麻薬
 ↓
 だからこそ、正しく扱うことが重要
 What is it?

Slide 8

Slide 8 text

キャッシュを利用するために
 
 必要なこと 
 What is it?

Slide 9

Slide 9 text

キャッシュの正しい知識を持ち
 
 キャッシュを正しく活用する
 What is it?

Slide 10

Slide 10 text

そのために必要なことを
 
 今日はお話します
 What is it?

Slide 11

Slide 11 text

1. 自己紹介
 2. キャッシュ導入時の検討事項
 3. キャッシュのアルゴリズムと判断基準
 4. キャッシュを使う上で大事なこと
 5. まとめ
 あじぇんだ

Slide 12

Slide 12 text

1. 自己紹介
 2. キャッシュ導入時の検討事項
 3. キャッシュのアルゴリズムと判断基準
 4. キャッシュを使う上で大事なこと
 5. まとめ
 あじぇんだ

Slide 13

Slide 13 text

自己紹介
 曽根 壮大(39歳)
 Have Fun Tech LLC 代表社員
 株式会社リンケージ CTO
 
 そ
 ● 日本PostgreSQLユーザ会 勉強会分科会 担当
 ● 3人の子供がいます(長女、次女、長男)
 ● 技術的にはWeb/LL言語/RDBMSが好きです
 ● コミュニティが好き たけ
 ね
 とも


Slide 14

Slide 14 text

突然の宣伝
 
予防医療のリンケージ
 
 
 ● リモートワークの不安を数値にするストレスチェック ● 女性の健康課題をサポートする ● リモートワーク、ちょっとした心配を相談できる安心をご提供 


Slide 15

Slide 15 text

1. 自己紹介
 2. キャッシュ導入時の検討事項
 3. キャッシュのアルゴリズムと判断基準
 4. キャッシュを使う上で大事なこと
 5. まとめ
 あじぇんだ

Slide 16

Slide 16 text

一番最初にやってほしいこと
 
 
 キャッシュ導入時の検討事項

Slide 17

Slide 17 text

一番最初にやってほしいこと
 ↓
 それ、本当にキャッシュが必要?
 キャッシュ導入時の検討事項

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

データベース アプリケーション キャッシュ データA データA データB データが更新 キャッシュ キャッシュ キャッシュ データ クラッシュ データB データA キャッシュが多段だとデータの状態がわかりにくい 一見するとここがおかしいように見えて、実は前段の キャッシュが壊れているのが原因 キャッシュが 1箇所であれば、確認する場所が明白

Slide 20

Slide 20 text

キャッシュが不要なら
 
 使わないに越したことはない
 キャッシュ導入時の検討事項

Slide 21

Slide 21 text

Cache(以下、キャッシュ)は特定の場面に置いて劇 的な効果を発揮し、様々な問題を解決する反面、 新 たなコンポートやミドルウェアが追加され、複雑性が 上がり、運用のレベルが上がるため、扱いに注意す る必要があります。  キャッシュを活用することで、パフォーマンスの改善 や負荷軽減が行われ、コンピュータリソースの最適 化によるサーバコストの削減や、レスポンスの改善 によるユーザエクスペリエンスの改善がされます。  反面、その劇的な効果に毒され安易に多用する と、サービスが強くキャッシュに依存してしまい、運用 が難しくなってしまいます。 これをWeb界隈では 「キャッシュは麻薬」と比喩されて、戒められてきまし た。

Slide 22

Slide 22 text

 そのためキャッシュを使わずにサービスが 運用できるのであれば使わないに越したこ とはないのですが、 ある一定以上の規模になった際に コン ピュータリソースの最適化、コストの改善な どの面においてキャッシュの活用は避けて は通れません。

Slide 23

Slide 23 text

本当に必要なときだけ
 
 使うと約束してくれ!!!
 キャッシュ導入時の検討事項

Slide 24

Slide 24 text

本当に必要なときだけ
 
 使うと約束してくれ!!!
 キャッシュ導入時の検討事項 実際に適切な設計の場合、多くのサービスは キャッシュが無くてもパ フォーマンスの課題 を解決できる

Slide 25

Slide 25 text

それでも
 
 キャッシュを使うあなたへ
 キャッシュ導入時の検討事項

Slide 26

Slide 26 text

使うために確認すること
 
 
 キャッシュ導入時の検討事項

Slide 27

Slide 27 text

使うために確認すること
 ↓
 キャッシュとの相性
 キャッシュ導入時の検討事項

Slide 28

Slide 28 text

 キャッシュしてもパフォーマンスが
 
 改善しないと意味が無い
 キャッシュ導入時の検討事項

Slide 29

Slide 29 text

キャッシュの相性を調べる
 
 
 キャッシュ導入時の検討事項

Slide 30

Slide 30 text

● 頻繁にアクセスされるデータ
 ● コストの高い計算結果
 ● データの更新頻度
 対象を決めるときの確認事項

Slide 31

Slide 31 text

キャッシュの効果が
 
 期待の範囲に納まるか
 キャッシュ導入時の検討事項

Slide 32

Slide 32 text

キャッシュの効果が
 
 期待の範囲に納まるか
 キャッシュ導入時の検討事項 「早くしたい」ではなく「この計算を xxxms以内に実行したい」という 具 体的な指標を作ること

Slide 33

Slide 33 text

キャッシュすることで
 
 問題が解決するぞ!となったら次へ
 キャッシュ導入時の検討事項

Slide 34

Slide 34 text

1. 自己紹介
 2. キャッシュ導入時の検討事項
 3. キャッシュのアルゴリズムと判断基準
 4. キャッシュを使う上で大事なこと
 5. まとめ
 あじぇんだ

Slide 35

Slide 35 text

キャッシュのアルゴリズムを決める
 
 
 キャッシュのアルゴリズムと判断基準

Slide 36

Slide 36 text

キャッシュのアルゴリズムを決める
 ↓
 データ更新と生存期間
 キャッシュのアルゴリズムと判断基準

Slide 37

Slide 37 text

データ更新のアルゴリズム
 
 
 キャッシュのアルゴリズムと判断基準

Slide 38

Slide 38 text

● Write-Through(ライトスルー)
 ● Write-Back Caching(ライトバックキャッシング)
 ● Write-Around(ライトアラウンド)
 ● Preloading/Warming Up
 (ペイローディング/ウォーミングアップ)
 ● Lazy Loading(レイジーロード)
 データ更新のアルゴリズム

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

データベース 読み込み キャッシュ 1. データ更新をキャッシュ側に行う データはキャッシュから参照する Write-Back Caching 書き込み データA データA データをキャッシュ側にまず行うため、データ変更の参照は即時に反映される。 キャッシュからデータベースに同期されるまでにタイムラグがあり、 その間にキャッシュのサーバが壊れるとデータロストにつながる 2. キャッシュからデータベースに書き込む

Slide 41

Slide 41 text

データベース 読み込み キャッシュ 4. 次回以降キャッシュから参照する Write-Around 書き込み データA データA データベースに最初に保存するため、データのロストの可能性がない データがUPDATE時にキャッシュ側のデータを削除する仕組みがないと、データの不整 合が発生する可能性がある。 前述の2つと違い、不要なキャッシュを作らない反面、初回の読み込みが遅い 1.データ更新をデータベースに行う 2. 初回はデータベースから参照する 3.初回の読み込みの際にデータベース から読み出してキャッシュに保存する

Slide 42

Slide 42 text

データベース 読み込み キャッシュ 起動時などに事前にキャッシュにロードする データはキャッシュから参照する Preloading/Warming Up データA データA コンフィグなどの変更されないデータは相性が良い サーバの起動時、デプロイ、日次バッチなどで事前にロードする仕組み全般 設定変更の際にリセットする仕組みがないと再起動が必要になったりする

Slide 43

Slide 43 text

読み込み キャッシュ データはキャッシュから参照する Lazy Loading 書き込み データA データA データベースにデータを更新して、参照時にキャッシュにデータがなければ キャッシュを生成してからデータをキャッシュから読み出す Write-Aroundと同様の特徴があり、亜種とも言える 2. データが無ければデータベースから キャッシュに書き込む データベース 1.データ更新をデータベースに行う

Slide 44

Slide 44 text

アルゴリズムの選び方
 
 
 キャッシュのアルゴリズムと判断基準

Slide 45

Slide 45 text

キャッシュのアルゴリズムと判断基準 ● データの鮮度
 ● リソース効率
 ● キャッシュヒット率


Slide 46

Slide 46 text

生存期間のアルゴリズム
 
 
 キャッシュのアルゴリズムと判断基準

Slide 47

Slide 47 text

生存期間のアルゴリズム
 ↓
 永続的に残るキャッシュデータは作らない
 キャッシュのアルゴリズムと判断基準

Slide 48

Slide 48 text

● 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
 生存期間のアルゴリズム

Slide 49

Slide 49 text

データベース アプリケーション Least Recently Used (LRU) データA データB 削除のイベント時に最も最後に使われたデータを削除する 過去に沢山使ったデータだとしても、使っていないデータから消される 最近のデータだとしても、使われていないと消される データA データA データC データB データC キャッシュ生成 データC データD キャッシュ データD 最近使った 最後に使われたデータ よく使う

Slide 50

Slide 50 text

データベース アプリケーション Least Frequently Used (LFU) データA データB 削除のイベント時に最も使われていないデータを削除する 最近のデータだとしても、利用頻度が少ないデータは削除する 期間を決めないと最近は使っていないが過去にすごく使われたデータが残る データA データA データC データB データC キャッシュ生成 データC データD キャッシュ データD たまにつかう 使われていないデータ よく使う

Slide 51

Slide 51 text

キャッシュ データベース アプリケーション First-In-First-Out (FIFO) データA データB 削除のイベント時に作られた順に削除する 利用頻度や直近の利用を考慮しない 新しいキャッシュデータが使われやすい場合に有効 よく使われていても消す 短い期間しか使われないデータやBatchの一時データのようなキャッシュで有効 データA データA データC データB データC データD データD データC 最近使った よく使う 1 2 3 4 キャッシュ生成順 最初に生成されたの で消す

Slide 52

Slide 52 text

キャッシュ データベース アプリケーション Random Replacement データB 削除のイベント時にランダムに削除 パフォーマンスとして最適ではないが、とりあえず消す必要があるとき セッションなどの一時的なデータや利用されるアクセスパターンが不確定な場合などに有効 利用中のキャッシュだとしても再取得できるような場合も有効 データA データA データC データB データC データD データD データC 最近使った よく使う 1 2 3 4 キャッシュ生成順 ランダムで消す データA

Slide 53

Slide 53 text

キャッシュ データベース アプリケーション Time-To-Live (TTL) データB 削除のイベント時に有効期限が終了しているデータを削除する イベントの開催状況やSNSのタイムラインなど言って期間変更されないデータで有効 有効期限を指定すれば、必ずすべてのキャッシュは消えるため、他のアルゴリズムと合わせて設定 することも多い データA データA データC データB データC データD データD データC 最近使った よく使う 2024/02/26 有効 有効期間が切れたから消す データA 2024/02/28 有効 2024/02/24 有効 2024/02/23 有効

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

キャッシュ データベース アプリケーション Time-To-Refresh データB 削除のイベント時に対象を削除する Refresh-Aheadの亜種。 Write-AroundやLazy Loadingを採用している場合に、古くなったデータを定期的に消す場合などで利用 する。 TTLを設定しておき、1時間に一回確認して有効期限切れのキャッシュを消す場合などが該当する データA データA データC データB データC データD データD データC 最近使った よく使う データA キャッシュ生成 定期的に消す

Slide 56

Slide 56 text

生存期間は絶対決めること!
 
 
 キャッシュのアルゴリズムと判断基準

Slide 57

Slide 57 text

1. 自己紹介
 2. キャッシュ導入時の検討事項
 3. キャッシュのアルゴリズムと判断基準
 4. キャッシュを使う上で大事なこと
 5. まとめ
 あじぇんだ

Slide 58

Slide 58 text

本当にキャッシュが必要か
 
 注意深く検討すること
 キャッシュを使う上で大事なこと

Slide 59

Slide 59 text

利用用途、アルゴリズムを決めてから
 
 保存先のデータストアを選ぶこと
 キャッシュを使う上で大事なこと

Slide 60

Slide 60 text

利用用途、アルゴリズムを決めてから
 
 保存先のデータストアを選ぶこと
 キャッシュを使う上で大事なこと プロセスキャッシュ、クライアントキャッシュ、ミドルウェアなど様々な選択 肢があるが、先にデータストアを決めてしまうとアルゴリズムなどが デー タストアに縛られてしまう

Slide 61

Slide 61 text

パフォーマンスの改善は
 
 ちゃんと計測すること
 キャッシュを使う上で大事なこと

Slide 62

Slide 62 text

パフォーマンスの改善は
 
 ちゃんと計測すること
 キャッシュを使う上で大事なこと キャッシュの設計、計測方法などは最初に Design docを書くと良い 基本設計はちゃんとしましょう Agile開発は手抜き開発とは違う

Slide 63

Slide 63 text

生存期間は絶対決めること!
 
 大事なことなので2回(ry
 キャッシュを使う上で大事なこと

Slide 64

Slide 64 text

キャッシュのリフレッシュ処理を
 
 最初から作っておく
 キャッシュを使う上で大事なこと

Slide 65

Slide 65 text

キャッシュを使う上で大事なこと

Slide 66

Slide 66 text

キャッシュの生成は
 
 常に冪等にする
 キャッシュを使う上で大事なこと

Slide 67

Slide 67 text

キャッシュが壊れたときに
 
 作り直せること
 キャッシュを使う上で大事なこと

Slide 68

Slide 68 text

キャッシュを作るときは
 
 キャッシュが作れないことも考慮する
 キャッシュを使う上で大事なこと

Slide 69

Slide 69 text

キャッシュが壊れたとき
 
 サービスにできるだけ影響を与えない
 キャッシュを使う上で大事なこと

Slide 70

Slide 70 text

キャッシュの種類、データストアを
 
 できるだけ増やさない
 キャッシュを使う上で大事なこと

Slide 71

Slide 71 text

できるだけ、コンポーネントを増やさない
 
 迷ったら、1番シンプルな方法を選ぶ
 キャッシュを使う上で大事なこと

Slide 72

Slide 72 text

キャッシュを使う上で大事なこと

Slide 73

Slide 73 text

キャッシュの多段、ダメ絶対!!!
 
 ※本当に辞めましょう
 キャッシュを使う上で大事なこと

Slide 74

Slide 74 text

キャッシュの乱用は
 
 運用を犠牲にする
 キャッシュを使う上で大事なこと

Slide 75

Slide 75 text

1. 自己紹介
 2. キャッシュ導入時の検討事項
 3. キャッシュのアルゴリズムと判断基準
 4. キャッシュを使う上で大事なこと
 5. まとめ
 あじぇんだ

Slide 76

Slide 76 text

目的を達成できる
 
 一番単純なものを選ぶ
 まとめ

Slide 77

Slide 77 text

● キャッシュする対象
 ● キャッシュのアルゴリズム
 ● キャッシュの生存期間
 まとめ

Slide 78

Slide 78 text

失敗を恐れるのではなく
 
 失敗できるようにする
 まとめ

Slide 79

Slide 79 text

問題解決できる技術力は
 
 正しい知識と行動の積み重ねに宿る
 まとめ

Slide 80

Slide 80 text

“問題があると、解決せずにはいられない”
 
 
 — 岩田聡(任天堂元社長)
 
 まとめ

Slide 81

Slide 81 text

技術で問題を解決しよう
 
 
 まとめ

Slide 82

Slide 82 text

ご清聴ありがとうございました
 
 
 まとめ