Webアプリケーションや分散システムでパフォーマンスを高めるために不可欠なのが「キャッシュ」の基本的な活用パターンについて書く。
アプリケーション側が必要に応じてキャッシュを明示的に操作するパターンである。
graph TD
A[アプリケーション] -->|読み込み要求| B[キャッシュ]
B -->|ヒット| A
B -->|ミス| C[データベース]
C -->|データ取得| A
A -->|キャッシュに保存| B
A -->|書き込み| C
A -->|キャッシュ無効化| B
sequenceDiagram
participant A as アプリケーション
participant C as キャッシュ
participant D as データベース
Note over A,D: 読み込み処理(キャッシュミス)
A->>C: データ要求
C->>A: キャッシュミス
A->>D: データ取得
D->>A: データ返却
A->>C: データをキャッシュに保存
Note over A,D: 書き込み処理
A->>D: データ更新
D->>A: 更新完了
A->>C: キャッシュ無効化
読み込み時にキャッシュがDBからの取得を自動的に処理するパターンである。アプリケーションはキャッシュのみとやり取りし、キャッシュミス時の処理は透過的に行われる。
graph TD
A[アプリケーション] -->|読み込み要求| B[キャッシュ]
B -->|ヒット| A
B -->|ミス時自動取得| C[データベース]
C -->|データ返却| B
B -->|自動保存後返却| A
A -->|書き込み| C
sequenceDiagram
participant A as アプリケーション
participant C as キャッシュ
participant D as データベース
Note over A,D: 読み込み処理(キャッシュミス)
A->>C: データ要求
C->>D: 自動的にDB取得
D->>C: データ返却
C->>C: 自動キャッシュ保存
C->>A: データ返却
Note over A,D: 書き込み処理
A->>D: データ更新(キャッシュバイパス)
D->>A: 更新完了
書き込み操作がまずキャッシュに行われ、同時にDBにも書き込む戦略である。
graph TD
A[アプリケーション] -->|書き込み要求| B[キャッシュ]
B -->|同期書き込み| C[データベース]
C -->|完了通知| B
B -->|完了通知| A
A -->|読み込み要求| B
B -->|キャッシュヒット| A
sequenceDiagram
participant A as アプリケーション
participant C as キャッシュ
participant D as データベース
Note over A,D: 書き込み処理
A->>C: データ更新要求
C->>D: 同期書き込み
D->>C: 書き込み完了
C->>A: 更新完了通知
Note over A,D: 読み込み処理
A->>C: データ要求
C->>A: キャッシュヒット(データ返却)
書き込み操作はまずキャッシュにのみ反映し、DBへの書き込みは非同期的に遅延処理される。
graph TD
A[アプリケーション] -->|書き込み要求| B[キャッシュ]
B -->|即座に完了通知| A
B -->|非同期でバッチ書き込み| C[データベース]
A -->|読み込み要求| B
B -->|キャッシュヒット| A
D[バックグラウンドプロセス] -->|定期的に| B
D -->|まとめて書き込み| C
sequenceDiagram
participant A as アプリケーション
participant C as キャッシュ
participant D as データベース
participant B as バックグラウンドプロセス
Note over A,D: 書き込み処理(非同期)
A->>C: データ更新要求
C->>A: 即座に完了通知
Note over A,D: 読み込み処理
A->>C: データ要求
C->>A: キャッシュヒット(データ返却)
Note over A,D: バックグラウンド同期
B->>C: ダーティデータ確認
C->>B: 未同期データ返却
B->>D: バッチ書き込み
D->>B: 書き込み完了
書き込み操作をキャッシュに反映せず、DBのみに書き込む戦略である。
graph TD
A[アプリケーション] -->|書き込み要求| C[データベース]
C -->|完了通知| A
A -->|読み込み要求| B[キャッシュ]
B -->|ミス| C
C -->|データ取得| B
B -->|キャッシュに保存後返却| A
B -.->|キャッシュをバイパス| X[書き込み時はスキップ]
sequenceDiagram
participant A as アプリケーション
participant C as キャッシュ
participant D as データベース
Note over A,D: 書き込み処理(キャッシュバイパス)
A->>D: データ更新(キャッシュスキップ)
D->>A: 更新完了
Note over A,D: 読み込み処理(キャッシュミス)
A->>C: データ要求
C->>A: キャッシュミス
A->>D: データ取得
D->>A: データ返却
A->>C: データをキャッシュに保存
戦略 | 概要 | 読み込み高速 | 書き込み高速 | 整合性 | キャッシュ管理 |
---|---|---|---|---|---|
キャッシュアサイド | アプリが明示的にキャッシュ操作 | ◎ | △(管理必要) | △(手動) | アプリが管理 |
リードスルー | キャッシュが透過的にDB取得 | ◎ | △(DBに直接) | △(読み込み時のみ) | 自動(読み込み) |
ライトスルー | キャッシュとDBに同時書き込み | ◎ | △(同期待機) | ◎(常に同期) | 自動 |
ライトバック | キャッシュのみ書き込み後で同期 | ◎ | ◎(非同期) | △(遅延同期) | 自動(リスクあり) |
ライトアラウンド | 書き込み時はキャッシュバイパス | ◎ | ◎(DB直接) | △(読み込みで整合) | 自動 |
どの戦略がベストかは、ユースケースとトレードオフによる。
選択時は以下の要素を考慮する:
キャッシュ戦略をうまく使いこなすことで、アプリケーションの性能と可用性は大きく向上する。各プロジェクトの要件に合った選択が重要である。
関連書籍