1

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"

前。それが問題を引き起こした可能性がありますか?キャッシュされたアクションは「静的アセット」と見なされますか?

4

1 に答える 1

0

Memcachierのバグであることが判明しました。Memcachierのサポートはこの結論に達し、Memcacheで正常に機能します。Memcachierはバグの修正を試みます。

于 2012-10-18T06:23:44.887 に答える