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

Это на самом деле также решило другую, совершенно другую проблему, к моему большому удивлению!

Другие вопросы по тегам