3

私は Rails.cache を使用しています (デフォルトストアと dalli gem で memcached の両方を試しましたが、同じ動作をしました) 動作しているようですが、そうではありません (ログはクエリが作成されていないことを示していますが、実際の結果は他の方法で表示)... 上位 10 件のクエリを 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 

しかし、検索ページに行って新しい検索語を繰り返し入力すると、トップ 10 の結果に表示され始めます。(ただし、トップ 10 の結果が 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(または.allRails 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 に答える