为什么 memcached 存储结果后数据库仍然被命中?

Why is the database still being hit even after memcached stores the result?

我正在使用活动记录进行一些基本查询,并尝试使用 dalli gem.

将结果存储在 memcached 中

我有以下代码:

@page = Rails.cache.fetch 'pages/index' do
  Page.find_by_name('index')
end

@grid_items = Rails.cache.fetch 'pages/index/grid_items' do
  @page.grid_items
end

'pages/index' 的存储和检索工作正常,但 'pages/index/grid_items' 仍然导致数据库查询。我本地主机的以下输出显示了这一点:

Cache read: pages/index
Cache fetch_hit: pages/index
Cache read: pages/index/grid_items
Cache fetch_hit: pages/index/grid_items
GridItem Load (0.7ms)  SELECT "grid_items".* FROM "grid_items" WHERE (status = 't') AND (page_id = 1)  ORDER BY "grid_items"."position" ASC

我曾尝试使用 "includes" 而不是 "joins",但没有成功。我还在控制台中检查了 Rails.cache.fetch 的结果,它 returns 是正确的数据。

答案是我需要确保 ActiveRecord 确实访问了数据库。我正在缓存查询对象,而不是结果。

为了触发数据库调用,我最终使用了这个,将查询转换为数组:

@grid_items = Rails.cache.fetch 'pages/index/grid_items' do
  @page.grid_items.live.to_a
end