1

我在 Heroku 上使用 Rails、Dalli gem、friendly_id 和 Memcachier。

我的问题类似于我之前遇到的问题,但在我开始使用 Memcache 而不是默认的 Rails 缓存后停止工作。应该注意的是,我对 Rails 缓存不是很熟悉,很可能我做错了很多事情(或者没有考虑简单的事情)。

生产.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' }

礼物#show - 控制器

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

礼物#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?但它不起作用。

我已经加载了几次特定的礼物#show-view 以确保它被缓存。在日志中,我还可以看到Read fragment views/gift-show--cash-stash (1.3ms)(在控制器之后),我认为这是片段实际存在的证据。只是在不需要时它正在通过缓慢(4秒)的礼物#show-controller。

如果我在 Heroku 上进入控制台并输入“ Rails.cache.read('gift-show--cash-stash')”,我会得到一个 nil 响应。

另一个奇怪的事情是,如果在控制台中执行以下操作:

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

This actually also solved another, completely different issue, to my great surprise!

于 2012-10-16T10:22:01.373 回答