酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Gem Dailliでキャッシュ(memcache)を有効活用してRailsを高速化!

Dalli』はRailsでmemcachedを使うためのクライアントです。特にWebアプリではアクセスが増えるとデータベース側の負荷が高まり、速度が遅くなってしまいます。そういった問題を解決する手段の一つとしてキャッシュを有効活用するのはすごく大切です!

ちなみにWebアプリにおけるキャッシュ。オレオレ事例 - ゆーすけべー日記のキャッシュについての説明がすごくわかりやすいです!


memcacheとは?

memcached

memcacheはデータベースを用いた Web サイトを高速化するために良く用いられるメモリにデータを格納するタイプのKey-Valueストアです。Webアプリでメモリにキャッシュするタイプでは最も有名だと思います。

Macへのインストール

MacでHomebrewを使ったインストールは以下の通り。

1
brew install memcached

インストールが正常に行われるとコンソール上に次のようなメッセージが出ます。自動機能の設定なので支持に従ってコマンドを実行して下さい。

1
2
cp /usr/local/Cellar/memcached/1.4.13/homebrew.mxcl.memcached.plist ~/Library/LaunchAgents/
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.memcached.plist

CentOS 6.3へのインストール

CentOS へのインストールは次の通り。

1
sudo yum --enablerepo=remi install memcached

インストールが完了したら起動。

1
sudo /etc/init.d/memcached start

ちゃんと起動しているか確認。

1
2
ps aux | grep memcached
> 496      15477  0.0  0.0 339960  1108 ?        Ssl  14:34   0:00 memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid #<= 成功

さらに自動起動を設定。

1
sudo chkconfig memcached on

Gemのインストール

いつもどおりGemfileに以下を追加して、bundle installを実行してください。

1
2
# memcacheクライアント
gem 'dalli'

Dalliの設定

本番環境で使う場合はconfig/environments/production.rbに、開発環境で使う場合にはconfig/environments/development.rbに次のコードをそれぞれ追記。

1
config.cache_store = :dalli_store

ちなみにより詳細な設定をする場合はこちら。

1
config.cache_store = :dalli_store, 'cache-1.example.com', 'cache-2.example.com', { :namespace => NAME_OF_RAILS_APP, :expires_in => 1.day, :compress => true }

さらに、『memcache-clientやdalliでfork後のresetは大切 | TechRacho』に書かれていたPassenger/Unicorn用の設定を/config/environments/production.rbに。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# passengerの場合
if defined?(PhusionPassenger)
  PhusionPassenger.on_event(:starting_worker_process) do |forked|
    Rails.cache.reset if forked

    ObjectSpace.each_object(ActionDispatch::Session::DalliStore) { |obj| obj.reset }
  end
end

# unicornの場合
after_fork do |server, worker|
  if defined?(ActiveSupport::Cache::DalliStore) && Rails.cache.is_a?(ActiveSupport::Cache::DalliStore)
    Rails.cache.reset

    ObjectSpace.each_object(ActionDispatch::Session::DalliStore) { |obj| obj.reset }
  end
end

Dalli(memcached)の使い方

Dalli(memcached)を試しにirb/pryで使ってみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
rails c

Rails.cache.write 'hoge', 'pugi'
# => true

Rails.cache.read 'hoge'
# => "pugi"

Rails.cache.delete 'hoge'
# => true

Rails.cache.read 'hoge'
# => nil

公式サイト

Dalliの公式GitHubはこちら。

dalli GitHub

補足:Capistranoでmemcacheをクリアする

CapistranoでDeployした時にキャッシュをクリアしたい場合の手順。 まず、タスク/lib/tasks/cache.rakeを作成して以下を記入。

1
2
3
4
5
6
7
8
9
# encoding: utf-8
require File.expand_path(File.dirname(__FILE__) + "/../../config/environment")

namespace :cache do
  desc 'Clear memcache'
  task :clear => :environment do
    Rails.cache.clear
  end
end

次にCapistranoのconfig/deploy.rbに以下を追加。

1
2
3
4
5
6
7
namespace :deploy do
  desc "キャッシュをクリア"
  task :clear_dalli_cache do
    run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake cache:clear"
  end
end
after :deploy, "deploy:clear_dailli_cache"

でCapistranoのデプロイ時にキャッシュをクリアできると思います。

Special Thanks

[CentOS] memcachedをインストールして、PHPから使用する | HAPPY*TRAP

Strictly Untyped: Clearing memcache without restart

RailsとDalliでMemcached体験 - watilde’s blog

memcache-clientやdalliでfork後のresetは大切 | TechRacho

おすすめの書籍