キャッシュ (Cache)
Ruby on Rails で使用可能なキャッシュ (ビルトイン機能 / 純正 gem)
- フラグメントキャッシュ
- ページキャッシュ (actionpack-page_caching )
- アクションキャッシュ (actionpack-action_caching )
- 低レベルキャッシュ
- SQL キャッシュ
参考:
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
参考:
ページキャッシュ (actionpack-page_caching)
Rails 4.0 以降は gem を使う。
参考:
rails/actionpack-page_caching: Static page caching for Action Pack – GitHub
アクションキャッシュ (actionpack-action_caching)
Rails 4.0 以降は gem を使う。
参考:
rails/actionpack-action_caching: Action caching for Action Pack – GitHub
フラグメントキャッシュ
個々の 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 %>
参考:
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 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