0

我刚刚尝试在加载 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

我没碰过

4

1 回答 1

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对此进行了更详细的讨论。尤其是第 5 步与我在这里提到的最相关。

于 2013-01-27T08:25:58.707 回答