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 を使用すればなんとかなりそう。