1

HerokuでRails、Dalli gem、friendly_id、Memcachierを使用しています。

私の問題は以前に発生した問題と似ていますが、デフォルトのRailsキャッシュの代わりにMemcacheを使い始めた後、機能しなくなりました。私はRailsのキャッシングにあまり精通しておらず、多くのことを間違って行っている(または単純なことを考慮していない)可能性が高いことに注意してください。

Production.rb

  config.action_controller.perform_caching = true
  config.cache_store = :dalli_store, 'mc2.ec2.memcachier.com:11211', { :namespace => 'my_app_name', :expires_in => 40.days, :compress => true, :username => 'asdf', :password => 'asdf' }

Gift#show-コントローラー

unless fragment_exist?("gift-show--" + @gift.slug)
  # Perform slow database fetches etc
end

Gift#show-表示

<% cache('gift-show--' + @gift.slug) do %>
 # Create HTML with lots of images and such
<% end %>

HerokuでMemcachierを使い始める前は、これは問題なく機能していました。私の推測ではfragment_exist?、Memcachierではなく、「デフォルトのRailsキャッシュ」(違いがある場合)をチェックインします。Rails.cache.exist?("gift-show--" + @gift.slug)代わりに使用しようとしましfragment_exist?たが、機能しません。

特定のgift#show-viewを数回ロードして、キャッシュされていることを確認しました。Read fragment views/gift-show--cash-stash (1.3ms)ログには、フラグメントが実際に存在することの証拠であると私が信じている(コントローラーの後で)また見ることができます。必要のないときは、遅い(4秒)gift#show-controllerを通過しているだけです。

Herokuでコンソールに入り、「Rails.cache.read('gift-show--cash-stash')」と入力すると、応答がありません。

もう1つの独特なことは、コンソールで次のことを行う場合です。

irb(main):014:0> Rails.cache.write("foo", "bar")
=> true
irb(main):015:0> Rails.cache.read("foo")
=> nil

変ですね。

では、fragment_existの代わりに何を使用すればよいですか?これを機能させるために?

4

1 に答える 1

1

これが解決策であると 100% 確信しているわけではありませんが、「memcachier」gem (持っていなかった) を追加し、production.rb を次のように変更しました。

  config.cache_store = :dalli_store

これは実際には、別のまったく異なる問題も解決しました。驚いたことに!

于 2012-10-16T10:22:01.373 に答える