我刚刚尝试在加载example.com/communities?sort=popular
时实现缓存我的代码就像这样。然而,似乎缓存不起作用 看起来每次重新加载时它仍在发送SQL ......
怎么了? 然后,当用户制作或编辑“社区”记录后,我想清除所有包含字符串“community_index_sort_by _”的存储缓存。
配置/环境/ development.rb
...
config.consider_all_requests_local = true
config.action_controller.perform_caching = true
config.cache_store = :dalli_store
...
community_controller.rb
def index
@key = "community_index_sort_by_" + params[:sort].to_s + "_page_" + params[:page].to_s
if params[:sort] == 'popular'
unless read_fragment(:controller => "communities", :action => "index", :action_suffix => @key)
@communities = Community.scoped.page(params[:page]).order("cached_votes_up DESC")
end
elsif params[:sort] == 'latest'
@communities = Community.scoped.page(params[:page]).order("created_at DESC")
end
end
我没有触及视图
答案 0 :(得分:1)
您显示的代码只是尝试从缓存中读取,它从不存储任何内容。如果您想在未找到任何值的情况下填充缓存(例如,在缓存未命中时),则可以使用Rails.cache.fetch
而不是read_fragment
。 fetch
将返回缓存的值(如果存在)。否则,如果传递了一个块,那么它将在发生缓存未命中时运行,并且返回值将存储在缓存中。例如,代码段的相关部分类似于
@communities = Rails.cache.fetch(["communities", "index", @key]) do
Community.scoped.page(params[:page]).order("cached_votes_up DESC")
end
修改对象时使缓存数据到期的建议方法是使缓存键包含一些在修改对象时更改的数据。这通常是updated_at
时间戳字段,ActiveRecord将在保存对象时自动更新。当对象直接用作缓存键的一部分时,updated_at
字段还具有自动用作缓存键的一部分的优点(例如,@community
的缓存键将导致缓存像communities/1-20130116113736
)这样的关键。这通常需要进行少量重组,以确保可以在缓存密钥中使用相关对象。 David Heinemeier Hansson discusses this in more detail。特别是第5步与我在这里提到的内容最相关。