Hatena::Grouprubyist

うんたらかんたらRuby RSSフィード

2010-03-15memcachedをsession storeに使用することについて

memcachedをsession storeに使用することについて

| memcachedをsession storeに使用することについて - うんたらかんたらRuby を含むブックマーク はてなブックマーク - memcachedをsession storeに使用することについて - うんたらかんたらRuby


session storeにはdb(active record)よりmemcachedが早くていいよ

という記事をよく見かける。


確かに実装は楽チン。

config.action_controller.session_store = :mem_cache_store

でも

memcachedってキャッシュなので

session切れて再ログインってのは、やだよなぁと思っていたところ

↓の記事を読んで、結構すっきりした。

Why storing session on memcached? - Bulknews::Subtech - subtech


(まぁ、ポリシー次第だとは思いますが)

基本はsessionは永続化したい。

だけど、rails標準では、write-through cache させていない。



そこで

Repcached - KLablabWiki

ですよ。


サーバ2台のマルチマスタを実現しているので、冗長構成にはピッタリ。


あとは

tokyo cabinet や他のkvsも試してみたい。

トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20100315

2010-03-13action cache with memcached

action cache with memcached

| action cache with memcached - うんたらかんたらRuby を含むブックマーク はてなブックマーク - action cache with memcached - うんたらかんたらRuby

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

トラックバック - http://rubyist.g.hatena.ne.jp/rochefort/20100313