SDN
← 概念一覧へ
キャッシュ

キャッシュの場所と対象

Cache Locations & What to Cache

キャッシュはクライアント・CDN・Webサーバー・DB・アプリの5か所に置ける。何をキャッシュするかは、行/クエリ単位/オブジェクト単位/レンダリング済みHTMLなど粒度の選択がある。

キーポイント
  • 5つの場所: Client(ブラウザ/OS)、CDN、Web server(リバースプロキシ/Varnish)、Database、Application(Memcached/Redis)。
  • アプリキャッシュ(Memcached/Redis)はRAM上なのでDB(ディスク)より高速。RAMは有限なのでLRU等で古いものを追い出す。
  • Redisは永続化(persistence)やsorted set/list等のデータ構造を持つ高機能版。
  • 何をキャッシュするか: 行レベル / クエリレベル / 完全なオブジェクト / レンダリング済みHTML。
  • DBクエリキャッシュの短所: 複雑なクエリ結果の無効化が難しい。1セル変われば関連する全キャッシュを消す必要。
トレードオフ

ユーザーに近い場所(クライアント/CDN)ほど速いが、更新の反映が遅れやすく制御しづらい。DBに近い場所(アプリキャッシュ)は制御しやすいが、その分ネットワーク往復がある。クエリ単位のキャッシュは作りやすいが無効化が難しい(1セルの変更で関連キャッシュを全部消すはめに)。オブジェクト単位は無効化しやすいが設計の手間がかかる。

どこに置けるか: ユーザーに近いほど速い

キャッシュはリクエストの経路上、いろいろな場所に置けます。ユーザーに近いほど速いが、制御は難しくなります。

図を描画中...
場所内容特徴
①Clientブラウザ・OSのキャッシュ最速だが制御しづらい
②CDNエッジサーバーのキャッシュ静的配信に強い
③Web serverリバースプロキシ(Varnish)静的/動的を直接返す
④DatabaseDBが内蔵するキャッシュ設定で調整
⑤ApplicationRedis/Memcached制御しやすく高速

アプリキャッシュ(Redis / Memcached)が主役

設計で『キャッシュを入れる』と言うとき、多くはこのアプリケーションキャッシュを指します。インメモリのキー・バリューストアで、RAM上なのでDB(ディスク)より高速。

ただしRAMは有限。入りきらなくなったら**LRU(Least Recently Used = 最近使われていない順)**などで古いものを追い出します。

RedisはMemcachedの上位互換的な高機能版で、**永続化(再起動でも消えない)**や、sorted set・listといった便利なデータ構造を持ちます。ランキングやキューにも使えます。

何をキャッシュするか(粒度)

クエリレベル

SQLクエリ文字列をハッシュ化してキーにし、結果を保存。

  • 長所: 作るのが簡単。
  • 短所(つまずき所): 無効化が難しい。元データの1セルが変わっただけで、そのセルを含むあらゆるクエリのキャッシュを消さないと古い結果が残る。どのクエリが影響を受けるか特定しづらい。

オブジェクトレベル

データを『オブジェクト』(例: ユーザーオブジェクト、レンダリング済みページ)として丸ごとキャッシュ。

  • 長所: 無効化しやすい(そのオブジェクトを消せばよい)。非同期処理とも相性が良い。
  • 対象例: ユーザーセッション、完全レンダリング済みページ、アクティビティストリーム、ユーザーのグラフデータ。
図を描画中...

つまずきポイント

  • クエリレベルキャッシュの無効化の難しさは実務で本当に厄介。基本はオブジェクトレベルで考える方が管理しやすい。
  • file-basedキャッシュ(各サーバーのローカルファイル)は、サーバーをクローン・オートスケールしづらくするので避ける。共有のRedis/Memcachedへ。

関連する概念

この概念で腕試し

関連する 9 問のクイズに挑戦できます。

クイズを解く