キャッシュとは
キャッシュとは、一度取得・生成したデータを一時的に保存し、再利用する仕組みです。
メリット
- 処理速度の向上:保存済みのデータを直接再利用することで、読み込み時間を短縮できる
- サーバー負荷の軽減:データベースや外部APIへのアクセス回数を減らせる
- コストの削減:通信量やサーバーリソースの使用量を抑えられる
デメリット
- 情報が古くなる可能性:元データの更新が、すぐに反映されない場合がある
- データ管理が複雑になる:有効期限や更新・削除の仕組みを設計する必要がある
- 管理対象が増える:保存容量の確保やキャッシュサーバーの障害対策が必要になる
キャッシュの基本設計
キャッシュを導入するときは、次の項目を決めます。
- 対象データ:更新頻度が低く、繰り返し参照され、取得や計算にコストがかかるデータを選ぶ
- 保存場所:ブラウザ、アプリ内メモリ、Redis、CDNなどから選ぶ
- 有効期限(TTL):データを保存しておく期間を設定する
- 更新・削除方法:元データの変更時にキャッシュを更新または削除する
- キャッシュキー:ユーザーや条件ごとにデータを正しく識別できる名前を設定する
- 障害時の動作:キャッシュを取得できない場合は、DBなどの元データを参照する
- セキュリティ:個人情報や認証情報を保存するか、暗号化が必要かを判断する
- 可用性:キャッシュサーバーの停止や再起動を想定する
キャッシュ期間を長くすると高速化しやすい一方、古いデータが残りやすくなります。データの更新頻度と、求められる正確性のバランスを考えることが重要です。
バックエンドでの対策
バックエンドでは、参照回数が多く、更新頻度が低いデータをキャッシュします。
キャッシュするデータの例
- 検索条件の選択肢:カテゴリ、都道府県、タグなど
- マスターデータ:商品区分やシステム設定など
- 検索結果・一覧データ:同じ検索条件で繰り返し取得される、利用頻度の高い一覧
- 詳細データ:アクセス数が多い商品や記事の情報
- 集計結果:ランキングや売上集計など、計算に時間がかかるデータ
- 外部APIの取得結果:天気や地図情報など
-
権限情報:JWTの
subから取得するロールや権限。ただし、短い有効期限と変更時の削除が必要
実装時の注意点
- 有効期限を設定する:古いデータが残り続けないようにする
- 更新時に削除する:DBを更新したら、関連するキャッシュも無効化する
- キャッシュキーを分ける:ユーザーや検索条件ごとのデータが混ざらないようにする
- アクセス集中を防ぐ:有効期限を分散し、期限切れ直後のDB負荷を抑える
- 障害時の処理を用意する:キャッシュを取得できない場合はDBから取得する
- 効果を監視する:ヒット率、応答時間、エラー数などを確認する
特に権限情報は、変更時にキャッシュを削除し、有効期限も短めに設定する必要があります。
フロントエンドでの対策
フロントエンドでは、ブラウザやアプリケーション内にデータをキャッシュし、通信やAPIの再取得を減らします。
キャッシュするデータの例
- 静的ファイル:画像、CSS、JavaScript、フォント
- 検索条件の選択肢:カテゴリや都道府県など、更新頻度の低いAPIデータ
- APIの取得結果:商品一覧や記事詳細など、繰り返し参照するデータ
実装時の注意点
- 有効期限を設定する:古いデータが残り続けないようにする
- 更新時に再取得する:登録や編集の完了後に、関連するキャッシュを更新または削除する
- 静的ファイルをバージョン管理する:ファイル名にハッシュ値を付け、更新後のファイルを確実に読み込ませる
-
機密情報を保存しない:トークンや個人情報を安易に
localStorageなどへ保存しない - ログアウト時に削除する:ユーザー固有のキャッシュが別の利用者に残らないようにする
APIデータのキャッシュには、TanStack QueryやSWRなどのライブラリを利用すると、有効期限や再取得を管理しやすくなります。
インフラでの対策
インフラでは、CDNやリバースプロキシにデータをキャッシュし、利用者に近い場所から配信します。
キャッシュするデータの例
- 静的ファイル:画像、CSS、JavaScript、フォント
- 公開コンテンツ:ニュースやブログなど、全ユーザーに共通するページ
- APIレスポンス:商品一覧など、ユーザーによって内容が変わらないデータ
設定時の注意点
-
有効期限を設定する:
Cache-Controlなどで保存期間を指定する - キャッシュキーを設計する:URL、クエリパラメータ、ヘッダー、Cookieなど、レスポンスを変化させる条件を適切に含める
- 更新方法を決める:CDNのキャッシュ削除やファイル名の変更で、更新を反映する
- 個人情報を保存しない:認証後の画面やユーザー固有のレスポンスを共有キャッシュの対象から外す
- アクセス集中を防ぐ:キャッシュ切れ直後に、オリジンサーバーへリクエストが集中しないようにする
- 可用性を確保する:サービスを冗長化し、障害時の迂回経路を用意する
- 効果を監視する:ヒット率、通信量、応答時間、エラー数を確認する
CDNにはCloudFrontやCloudflare、リバースプロキシにはNginxなどが利用されます。
まとめ
キャッシュを活用すると、データの取得を高速化し、サーバーの負荷やコストを抑えられます。バックエンド、フロントエンド、インフラの特性に合わせて、対象データや有効期限、更新・削除方法を適切に設計することが重要です。