mcpField
C
caching-strategies

caching-strategies

github.com/thibautbaissac開発67156 回インストール22 週間前に更新
リポジトリ

caching-strategies について

Rails 8 開発者向けのキャッシュ戦略スキルです。フラグメント、低レベル、HTTP キャッシュのほか、ビュー、クエリ、レスポンス向けのストア選択と無効化方法を扱います。

主な機能

  1. 01フラグメントとコレクションのキャッシュ
  2. 02入れ子の Russian doll キャッシュ
  3. 03低レベルデータキャッシュ
  4. 04HTTP 条件付きリクエストとヘッダー
  5. 05キャッシュストアの選択と無効化

活用シーン

  1. 01負荷の高いビューフラグメントのキャッシュ
  2. 02コレクション内の項目キャッシュの再利用
  3. 03高コストなクエリの重複実行の回避
  4. 04API レスポンスへの HTTP キャッシュ設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/thibautbaissac/rails_ai_agents --skill caching-strategies

インストール後、Claude Code で/caching-strategiesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
cache-invalidation.md
http-caching-and-testing.md
low-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 キャッシュヘッダーを設定する
  • 必要に応じてコールドスタート用にキャッシュをウォームアップする
  • ヒット率/ミス率を監視する

参考資料

コメント