Ruby on Rails - 为什么这个"fragment cache"不起作用?



我刚刚尝试在加载缓存时实现缓存 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_fragmentfetch将返回缓存的值(如果存在)。否则,如果传递了一个块,那么它将在发生缓存未命中时运行,并且返回值将存储在缓存中。例如,代码片段的相关部分类似于

@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 步与我在这里提到的内容最相关。

最新更新