Fragment_exist для Memcache не находит кэшированную информацию
Я использую Rails, Dalli gem, friendly_id и Memcachier на Heroku.
Моя проблема похожа на проблему, с которой я столкнулся ранее, но она перестала работать после того, как я начал использовать Memcache вместо стандартного кеша Rails. Следует отметить, что я не очень знаком с кешированием 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 %>
Это работало хорошо, прежде чем я начал использовать Memcachier на Heroku. Я думаю, что fragment_exist?
не проверяет в Memcachier, а в "кэше Rails по умолчанию" (если есть разница). Я пытался использовать Rails.cache.exist?("gift-show--" + @gift.slug)
вместо fragment_exist?
но это не работает
Я загрузил определенный подарок #show - view несколько раз, чтобы убедиться, что он кэширован. В логах я тоже вижу Read fragment views/gift-show--cash-stash (1.3ms)
(после контроллера), который, я считаю, является доказательством того, что фрагмент действительно существует. Просто он проходит через медленный (4 секунды) подарок #show - controller, когда в этом нет необходимости.
Если я войду в консоль на Heroku и введите "Rails.cache.read('gift-show--cash-stash')
"Я получаю нулевой ответ.
Еще одна особенность заключается в том, что если в консоли сделать следующее:
irb(main):014:0> Rails.cache.write("foo", "bar")
=> true
irb(main):015:0> Rails.cache.read("foo")
=> nil
Это странно, не правда ли?
Итак, что я должен использовать вместо frag_exist? для того, чтобы сделать эту работу?
1 ответ
Я не уверен на 100%, что это решение, но я добавил гем 'memcachier' (которого у меня не было) и изменил мой production.rb на:
config.cache_store = :dalli_store
Это на самом деле также решило другую, совершенно другую проблему, к моему большому удивлению!