Rails.cache - 工作但不工作

时间:2012-09-20 12:29:15

标签: ruby-on-rails ruby-on-rails-3 memcached dalli

我正在使用Rails.cache(我已尝试使用dalli gem的默认存储和memcached - 但我得到相同的行为)似乎正在工作,但不是(日志显示)没有进行查询,但实际结果显示其他情况)...我有一个搜索页面缓存前十个查询1天:

search.rb

  def self.top_ten
    Rails.cache.fetch("top_ten_searches_cache", :expires_in => 1.day) do
      Search.order("count DESC").limit(10)
    end    
  end 

但是,当我进入搜索页面并重复输入新的搜索字词时,它会开始显示在前十个结果中! (虽然我不希望十大结果在1天过去之前发生变化。)当缓存存储是默认的时候,日志中没有显示任何查询(所以你认为缓存正在工作),当使用dalli / memcached时,我得到了完全一样的结果行为,但在日志中有这个:

Cache read: top_ten_searches_cache ({:expires_in=>1 day})
Cache fetch_hit: top_ten_searches_cache ({:expires_in=>1 day})

Cache fetch_hit究竟是什么意思?这是否意味着没有找到缓存并且不得不进行查询?

不确定发生了什么 - 奇怪的是我使用默认存储或使用Dalli的memcached获得相同的行为。

1 个答案:

答案 0 :(得分:12)

您正在缓存范围,而不是查询的实际结果。 Rails使用延迟加载,因此要强制查询执行,您需要将.to_a(或.all放在Rails 3中),例如:

def self.top_ten
  Rails.cache.fetch("top_ten_searches_cache", :expires_in => 1.day) do
    Search.order("count DESC").limit(10).to_a
  end    
end 

请参阅here