caching-strategies について
Rails 8 開発者向けのキャッシュ戦略スキルです。フラグメント、低レベル、HTTP キャッシュのほか、ビュー、クエリ、レスポンス向けのストア選択と無効化方法を扱います。
主な機能
- 01フラグメントとコレクションのキャッシュ
- 02入れ子の Russian doll キャッシュ
- 03低レベルデータキャッシュ
- 04HTTP 条件付きリクエストとヘッダー
- 05キャッシュストアの選択と無効化
活用シーン
- 01負荷の高いビューフラグメントのキャッシュ
- 02コレクション内の項目キャッシュの再利用
- 03高コストなクエリの重複実行の回避
- 04API レスポンスへの HTTP キャッシュ設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ thibautbaissac/ rails_ai_agents --skill caching-strategiesインストール後、Claude Code で/caching-strategiesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/cache-invalidation.mdhttp-caching-and-testing.mdlow-level-caching.md詳細
Rails 8 のキャッシュ戦略
概要
Rails には複数のキャッシュレイヤーがあります。
- フラグメントキャッシュ:ビューのパーシャルをキャッシュします
- ロシア人形キャッシュ:キャッシュフラグメントをネストします
- 低レベルキャッシュ:任意のデータをキャッシュします
- HTTP キャッシュ:ブラウザーと CDN のキャッシュです
- クエリキャッシュ:リクエスト内で自動的に行われます
クイックスタート
# config/environments/development.rb
config.action_controller.perform_caching = true
config.cache_store = :memory_store
# config/environments/production.rb
config.cache_store = :solid_cache_store # Rails 8 default
# OR
config.cache_store = :redis_cache_store, { url: ENV["REDIS_URL"] }
開発環境でキャッシュを有効にします。
bin/rails dev:cache
キャッシュストアのオプション
| ストア | 用途 | メリット | デメリット |
|---|---|---|---|
:memory_store | 開発環境 | 高速、セットアップ不要 | 共有されない、サイズに制限あり |
:solid_cache_store | 本番環境(Rails 8) | データベースベース、Redis 不要 | やや低速 |
:redis_cache_store | 本番環境 | 高速、共有可能 | Redis が必要 |
:file_store | シンプルな本番環境 | 永続的、Redis 不要 | 低速、共有されない |
:null_store | テスト | キャッシュなし | 該当なし |
フラグメントキャッシュ
基本的なフラグメントキャッシュ
<%# app/views/events/_event.html.erb %>
<% cache event do %>
<article class="event-card">
<h3><%= event.name %></h3>
<p><%= event.description %></p>
<time><%= l(event.event_date, format: :long) %></time>
<%= render event.venue %>
</article>
<% end %>
キャッシュキーの構成要素
Rails は次の要素からキャッシュキーを生成します。
- モデル名
- モデル ID
updated_atのタイムスタンプ- テンプレートダイジェスト(自動)
# Generated key example:
# views/events/123-20240115120000000000/abc123digest
カスタムキャッシュキー
<%# With version %>
<% cache [event, "v2"] do %>
...
<% end %>
<%# With user-specific content %>
<% cache [event, current_user] do %>
...
<% end %>
<%# With explicit key %>
<% cache "featured-events-#{Date.current}" do %>
<%= render @featured_events %>
<% end %>
ロシア人形キャッシュ
外側のキャッシュが無効化されたときに、内側のキャッシュを再利用するネストされたキャッシュです。
<%# app/views/events/show.html.erb %>
<% cache @event do %>
<h1><%= @event.name %></h1>
<section class="vendors">
<% @event.vendors.each do |vendor| %>
<% cache vendor do %>
<%= render partial: "vendors/card", locals: { vendor: vendor } %>
<% end %>
<% end %>
</section>
<section class="comments">
<% @event.comments.each do |comment| %>
<% cache comment do %>
<%= render comment %>
<% end %>
<% end %>
</section>
<% end %>
無効化を連鎖的に上位へ伝えるには、belongs_to アソシエーションで touch: true を使用します。例については、cache-invalidation.md を参照してください。
コレクションキャッシュ
効率的なコレクションのレンダリング
<%# Caches each item individually %>
<%= render partial: "events/event", collection: @events, cached: true %>
<%# With custom cache key %>
<%= render partial: "events/event",
collection: @events,
cached: ->(event) { [event, current_user.admin?] } %>
低レベルキャッシュ
最も一般的なパターンでは、ブロック付きの Rails.cache.fetch を使用します。次の内容については、low-level-caching.md を参照してください。
- 基本的な読み取り/書き込み/取得の例
- サービスオブジェクトでのキャッシュ
- クエリオブジェクトでのキャッシュ
- インスタンス変数のメモ化
CurrentAttributesを使用したリクエストスコープのメモ化
キャッシュの無効化
主な戦略は、時間ベースの期限切れ、キー(updated_at を使用)ベースの期限切れ、手動削除の 3 つです。次の内容については、cache-invalidation.md を参照してください。
- 時間ベースおよびキーに基づく期限切れ
- モデルのコールバックやサービスでの手動無効化
- パターンに基づく削除(
delete_matched) - ロシア人形キャッシュの連鎖には
touch: true - 組み込みおよびカスタムのカウンターキャッシュ
HTTP キャッシュ
条件付き GET(ETag/Last-Modified)には stale? を、Cache-Control ヘッダーには expires_in を使用します。詳しい例については、http-caching-and-testing.md を参照してください。
キャッシュのテスト
スペックでキャッシュを有効にするには、:caching メタデータタグを使用します。次の内容については、http-caching-and-testing.md を参照してください。
rails_helper.rbの設定- キャッシュされたビューの無効化のテスト
- サービスでのキャッシュ無効化のテスト
- パフォーマンスの監視と計測
チェックリスト
- 環境に応じてキャッシュストアを設定する
- 高コストなパーシャルでフラグメントキャッシュを使用する
- ロシア人形キャッシュ用に belongs_to で
touch: trueを設定する -
cached: trueを指定してコレクションをキャッシュする - 高コストなクエリに低レベルキャッシュを使用する
- キャッシュ無効化戦略を定義する
- 件数にはカウンターキャッシュを使用する
- API に HTTP キャッシュヘッダーを設定する
- 必要に応じてコールドスタート用にキャッシュをウォームアップする
- ヒット率/ミス率を監視する
参考資料
- low-level-caching.md - fetch/read/write、サービスオブジェクト、クエリオブジェクト、メモ化
- cache-invalidation.md - 期限切れ戦略、手動無効化、touch、カウンターキャッシュ
- http-caching-and-testing.md - ETag、Cache-Control、スペックの設定、監視