action cache with memcached

railsのキャッシュには
page / action / fragment
がある。


page cachingはrailsの内部処理が省けるので非常に高速。
ディスクに出力結果を格納する(cache storeを選択できない)。


今回は、memcachedの使用を前提としたので
action / fragment caching のどちらかだが
requestされるurlベースでcachingしたかったので
action cachingを使用してみた。

install

gem install memcache-client
gem install system_timer

書き方

# environments/develop.rb
config.action_controller.perform_caching = true
config.cache_store = :mem_cache_store, 'localhost:11211', { :namespace => 'app' }
# /opt/local/lib/ruby/gems/1.8/gems/memcache-client-1.8.0/lib/memcache.rb
DEFAULT_OPTIONS = {
  :namespace    => nil,
  :readonly     => false,
  :multithread  => true,
  :failover     => true,
  :timeout      => 0.5,
  :logger       => nil,
  :no_reply     => false,
  :check_size   => true,
  :autofix_keys => false,
  :namespace_separator => ':',
}

namespaceは、environmentとかversionとか入れた方がいいかも。

# controller
caches_action :index, :expires_in => 5.seconds

確認方法

telnet localhost 11211
# idを調べる
stats items
STAT items:16:number 1
STAT items:16:age 20936
STAT items:16:evicted 0
STAT items:16:evicted_time 0
STAT items:16:outofmemory 0
STAT items:16:tailrepairs 0
END

#詳細を確認
stats cachedump 16 100
ITEM app:views/localhost:3000/hoges [2388 b; 1268504202 s]
END

もうちっとみやすいツールはないんだろうか。

memcachedがダウンしていると

ログ上は、こんな感じ。

MemCacheError (No connection to server (localhost:11211 DEAD (Errno::ECONNREFUSED: Connection refused - connect(2)), will retry at Sat Mar 13 20:45:12 +0900 2010)): No connection to server (localhost:11211 DEAD (Errno::ECONNREFUSED: Connection refused - connect(2)), will retry at Sat Mar 13 20:45:12 +0900 2010)
Cached fragment miss: views/localhost:3000/hoges (1.3ms)

エラーなく使えるし、memcachedを上げると
再びcacheを利用するようになる。

課題

page / action cachingはクエリストリングス(パラメータ)を認識しないでキャッシュしちゃう。
action caching は、ソースを見たところcache_path を使用すればなんとかなりそう。