为什么 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
我正在使用活动记录进行一些基本查询,并尝试使用 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