3

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

搜索.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 得到相同的行为。

4

1 回答 1

15

您正在缓存范围,而不是查询的实际结果。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 

这里

于 2012-09-20T12:58:19.187 回答