我刚刚尝试在加载缓存时实现缓存 example.com/communities?sort=popular
我的代码就是这样。但是,缓存似乎不起作用。
看起来每次重新加载时它仍然在发送 SQL......
怎么了?然后,当用户制作或编辑"社区"记录后,我想清除所有包含字符串"community_index_sort_by_"的存储缓存。
config/environment/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
我还没有摸过视野
您显示的代码仅尝试从缓存中读取,它从不向其存储任何内容。如果要在找不到值时填充缓存(例如,在缓存未命中时),可以使用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对此进行了更详细的讨论。特别是第 5 步与我在这里提到的内容最相关。