Heroku、Dalli、MemcachierでRails3.1.1を使用します。
Production.rb
config.cache_store = :dalli_store
config.action_controller.perform_caching = true
Gemfile
gem 'memcachier'
gem 'dalli'
Controller#Show
unless fragment_exist?("gift-show--" + @gift.slug)
# Perform complicated database query at 4-5 sec
end
意見
<% cache('gift-show--' + @gift.slug, :expires_in => 3456000) do # 40 days %>
# Create an HTML
<% end %>
キャッシュされたページがロードされたときのログ出力
2012-10-17T03:15:43+00:00 app[web.2]: Started GET "/present/baka-kaka-set" for 23.20.90.66 at 2012-10-17 03:15:43 +0000
2012-10-17T03:15:43+00:00 app[web.2]: Could not find fragment for gift-show--baka-kaka-set # my log comment
2012-10-17T03:15:44+00:00 heroku[router]: GET www.mydomain.com/present/baka-kaka-set dyno=web.2 queue=0 wait=0ms service=195ms status=200 bytes=17167
2012-10-17T03:15:43+00:00 app[web.2]: cache: [GET /present/baka-kaka-set] miss
2012-10-17T03:15:43+00:00 app[web.2]: Processing by GiftsController#show as */*
2012-10-17T03:15:43+00:00 app[web.2]: Parameters: {"id"=>"baka-kaka-set"}
2012-10-17T03:15:43+00:00 app[web.2]: Exist fragment? views/gift-show--baka-kaka-set (1.5ms)
2012-10-17T03:15:43+00:00 app[web.2]: Read fragment views/gift-show--baka-kaka-set (1.5ms)
2012-10-17T03:15:43+00:00 app[web.2]: Write fragment views/gift-show--baka-kaka-set (4.0ms)
各ページは、作成されるとほとんど静的であるため、有効期限が長くなります(40日)。
このようにページをロードすると、キャッシュに書き込まれているように見えます。ページをリロードして、コントローラーをバイパスし(予想どおり)、ページを非常に高速に配信することを確認できます。
私の問題
問題は、数分後にページに戻ると、すでにキャッシュから削除されていることです。fragment_exist?('gift-show--gift-baka-kaka-set')
falseを返します(そうしますRails.cache.exist?('views/gift-show--gift-baka-kaka-set')
)
Memcachier分析では、キーの数が減少していることがわかります。(フラグメントキャッシュを作成するために)各ページをロードするスクリプトを実行しても、Memcachierのキーの数は同じ割合で増加しません。
Memcachierのメモリ使用量の約34%になっているので、制限に近づいていません。
私の質問
私は完全に間違ったことをしていますか?私はむしろ何をすべきですか?
2つの異なるキャッシュなどに書き込んでいる可能性がありますか?
ログファイルの最後の行は少し混乱します。フラグメントを読み取った後も、新しいフラグメントが書き込まれているように見えますか?それは変ですか?
更新1:私は次の行をコメントアウトしたことに気づきました:
# Set expire header of 30 days for static files
config.static_cache_control = "public, max-age=2592000"
前。それが問題を引き起こした可能性がありますか?キャッシュされたアクションは「静的アセット」と見なされますか?