0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Webアプリにおけるキャッシュ設計入門

0
Posted at

キャッシュとは

キャッシュとは、一度取得・生成したデータを一時的に保存し、再利用する仕組みです。

メリット

  • 処理速度の向上:保存済みのデータを直接再利用することで、読み込み時間を短縮できる
  • サーバー負荷の軽減:データベースや外部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などが利用されます。

まとめ

キャッシュを活用すると、データの取得を高速化し、サーバーの負荷やコストを抑えられます。バックエンド、フロントエンド、インフラの特性に合わせて、対象データや有効期限、更新・削除方法を適切に設計することが重要です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?