この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Webアプリを高速化するのに memcached を使うことがある。
今回は Ruby on Rails 上で memcached 簡単に行うことができる gem に dalli を使ったときのメモ。
■ 環境
OS (cat /etc/redhat-release )
CentOS Linux release 7.1.1503 (Core)
kernel (uname -r)
3.10.0-229.1.2.el7.x86_64
memcached
rpm -qa memcached
memcached-1.4.15-9.el7.x86_6
ruby
ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
rails -v
Rails 4.2.2
gem list pry
LOCAL GEMS ***
pry (0.10.1)
pry-rails (0.3.4)
gem list dalli
LOCAL GEMS ***
dalli (2.7.4)
■ dalli インストール例
dnf install memcached
gem install dalli
■ rails アプリケーションの設定ファイルの記載
config/environments/development.rb に下記行を追記。
※ 本番環境なら config/environments/production.rb
config.cache_store = :dalli_store
■ 基本的な使い方
キャッシュを作成する
Rails.cache.write(key, obj)
キャッシュを読み込む
Rails.cache.read(key)
キャッシュがあれば読み込み、なければ作成し読み込む
Rails.cache.delete(key)
Rails.fetch(key, obj, expires_in: cache_tol_sec) do
obj
end
※ キャッシュの寿命を指定するには write や fetch の第3引数に秒数を指定する。
■ 気をつけること
ひとつのキーでひとつの値を保持するのでdevlopmentや test など複数環境で使用することを考慮しておく。
テーブル名や引数、sql文などをキーにしているときにテスト実施後に開発環境で表示不具合が発生した。memcache はキーバリューなので不自然でないが rails の開発時に環境ごとの db の切り替えに気を使ったコーディングをすることが少ないので注意。この度はキーに “#{Rails.env.first}_” の接頭辞をつけるようにして解決。
キーはシンボルで指定しても文字列で作成されるので意図せぬ書き換えに注意。
Rails.cache.write(:key_str, obj1)
Rails.cache.write('key_str', obj2)
Hash と異なる。
DBレコードごとにキャッシュを作成する場合、レコードの更新・削除にあわせてキャッシュも更新すること。
after_save や after_destroy などを使うとよいかも。