キャッシュ (Cache)

Ruby on Rails で使用可能なキャッシュ (ビルトイン機能 / 純正 gem)

参考:

Rails のキャッシュ 概要 | Rails ガイド [公式]

Rails アプリを66%スピードアップ – Railsキャッシュの完全ガイド | POSTD

Speed Up Your Rails App by 66% – The Complete Guide to Rails Caching | Speedshop

Built-in Caching | Fastly Blog

キャッシュの設定

production 環境でキャッシュを有効にする。(低レベルキャッシュには影響しない。)

config.action_controller.perform_caching = true

参考:

基本的なキャッシュ | Rails ガイド [公式]

ページキャッシュ (actionpack-page_caching)

Rails 4.0 以降は gem を使う。

参考:

rails/actionpack-page_caching: Static page caching for Action Pack – GitHub

ページキャッシュ | Rails ガイド [公式]

アクションキャッシュ (actionpack-action_caching)

Rails 4.0 以降は gem を使う。

参考:

rails/actionpack-action_caching: Action caching for Action Pack – GitHub

アクションキャッシュ | Rails ガイド [公式]

フラグメントキャッシュ

個々の product をキャッシュしておいてパーシャルで render する。

<% @products.each do |product| %>
  <% cache product do %>
    <%= render product %>
  <% end %>
<% end %>

cache_if もしくは cache_unless を使って条件付きでキャッシュする。

<% cache_unless admin?, @product do %>
  <%= render @product %>
<% end %>

コレクションキャッシュを使う。(必要なキャッシュが適宜書き込み・読み出しされる。)

<%= render "partials/product",
      collection: @vendor.products, cached: true %>

参考:

フラグメントキャッシュ | Rails ガイド [公式]

Caching result sets and collection in Rails 5 | BigBinary Blog

cache – ActionView::Helpers::CacheHelper | Ruby on Rails API [Official]

cache_if – ActionView::Helpers::CacheHelper | Ruby on Rails API [Official]

cache_unless – ActionView::Helpers::CacheHelper | Ruby on Rails API [Official]

キャッシュストア

  • ActiveSupport::Cache::Store:キャッシュストアを表す抽象クラス
  • ActiveSupport::Cache::MemCacheStore:memcached により構成されるキャッシュストア (メモリ上にキャッシュを保存する)
  • ActiveSupport::Cache::FileStore:ファイルシステム上に構成されるキャッシュストア
  • ActiveSupport::Cache::MemoryStore:メモリ上に構成されるキャッシュストア (プロセスをまたがってキャッシュは共有されない)

参考:

ActiveSupport::Cache::Store | Ruby on Rails API [Official]

ActiveSupport::Cache::MemCacheStore | Ruby on Rails API [Official]

ActiveSupport::Cache::FileStore | Ruby on Rails API [Official]

ActiveSupport::Cache::MemoryStore | Ruby on Rails API [Official]

write / fetch

キャッシュに書き込む。

cache.write("today", "Friday")

キャッシュから読み出す。

cache.fetch("today")  # => "Friday"

ブロックで値を指定してキャッシュを読み書きする。(キャッシュされていなかった場合にブロックを評価してブロックが返す値をキャッシュする。)

cache.fetch("city")  # => nil
cache.fetch("city") do
  "New York City"
end
cache.fetch("city")  # => "New York City"

参考:

fetch – ActiveSupport::Cache::Store | Ruby on Rails API [Official]

Rails.cache について | 酒と涙とRubyとRailsと

expires_in

キャッシュの有効期限を指定する。

参考:

What is the default expiry time for Rails cache? – Stack Overflow

delete / delete_matched

参考:

delete – ActiveSupport::Cache::Store | Ruby on Rails API [Official]

delete_matched – ActiveSupport::Cache::Store | Ruby on Rails API [Official]

delete_matched – ActiveSupport::Cache::MemoryStore | Ruby on Rails API [Official]

Marshal

ActiveSupport::Cache::Store がキャッシュできるのは、Marshal.dump できるオブジェクトに限定される。

参考:

ActiveSupport::Cache::Store と Marshal の話 | DoRuby

Rails の ActiveSupport::Cache の実装とデータの保存形式について調べてみた | dkkoma’s blog

module Marshal (Ruby 2.6.0)

module function Marshal.#dump (Ruby 2.6.0)

キャッシュの有効・無効を切り替える

rails dev:cache を実行する度に development 環境におけるキャッシュの有効・無効が切り替わる。

$ rails dev:cache

参考:

rails dev:cache コマンドで development モードでのキャッシュを簡単にオン・オフできる | TechRacho

development 環境のキャッシュ – Rails のキャッシュ 概要 | Rails ガイド [公式]

MemoryStore#prune

キャッシュが指定されたサイズ内に収まるように古いキャッシュを削除する。

参考:

prune – ActiveSupport::Cache::MemoryStore | Ruby on Rails  API [Official]

Rails.cache / config.cache_store

参考:

Rails.cache について | 酒と涙とRubyとRailsと

Rails.cache – rails/bootstrap.rb at v5.2.3 · rails/rails – GitHub

cache_store – rails/configuration.rb at v5.2.3 · rails/rails – GitHub

ブラウザキャッシュの無効化

特定のコントローラのページのみブラウザにキャッシュさせない。

<% if controller.controller_name == "admin" then %>
  <meta http-equiv="Expires" content="0">
<% end %>

Memcached

参考:

memcached – a distributed memory object caching system [Official]

memcached/memcached: memcached development tree – GitHub

memcached/memcached Wiki – GitHub

Dalli

参考:

petergoldstein/dalli: High performance memcached client for Ruby – GitHub

アプリの意味不明な時間を削って速度を10倍にした話 – Qiita

カウンターキャッシュ

参考:

関連レコード数の集計 (カウンターキャッシュ) – Qiita

counter_cache を使ってみよう | DoRuby

counter_cache | Rails ドキュメント (railsdoc.com)

いいね機能の実装 (reload しないと反映されない問題の解決) – Qiita

Three easy steps to using counter caches in Rails | Breyten Ernsting

Counter Cache Column in Rails 5 | Ruby Plus

Caching counters with ActiveRecord’s counter caches | AppSignal Blog

The SQL Alternative To Counter Caches | Eric Anderson

Forget counter cache for many-to-many associations in Rails (Example) | Coderwall

Rails counter_cache not updating correctly – Stack Overflow

Multiple counter_cache in Rails model – Stack Overflow

counter_culture

参考:

magnusvk/counter_culture: Turbo-charged counter caches for your Rails app – GitHub

Rails 向け高機能カウンタキャッシュ gem ‘counter_culture’ README 翻訳 | TechRacho

lookup_store

シンボルと引数を渡して指定したキャッシュを構成する。

メモリストアを構成する。

Rails.cache =
  ActiveSupport::Cache.lookup_store(:memory_store)

ファイルストアを構成する。

Rails.cache =
  ActiveSupport::Cache.lookup_store(:file_store, "/tmp/cache")

参考:

lookup_store – ActiveSupport::Cache | Ruby on Rails API [Official]

lookup_store – rails/cache.rb at v5.2.3 · rails/rails – GitHub

Rails.cache – rails/bootstrap.rb at v5.2.3 · rails/rails – GitHub

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です