用于索引操作的Rails缓存策略

时间:2013-07-28 11:34:37

标签: ruby-on-rails ruby-on-rails-3 caching ruby-on-rails-3.2 memcached

在我的用户索引操作中,我正在运行查询,该查询会查找与current_user属性相同的所有用户以及异性,并在profile_update_at中按DESC对结果进行排序订购。查询工作得很好。该应用目前正在3个城市运行。因此,来自A市的每个男性基本上都在运行相同的查询,对于来自A市的女性也是如此。

我希望能够将此查询缓存大约5分钟。我怎样才能做到这一点?我应该使用什么类型的缓存?由于查询取决于current_user的城市和性别,因此从城市A为用户创建的缓存是否会干扰用户从城市B的查询?或者,将为City B中的用户创建新缓存。

1 个答案:

答案 0 :(得分:2)

您可以使用Rails.cache(http://guides.rubyonrails.org/caching_with_rails.html#cache-stores)。城市和性别的每个组合都是缓存的唯一关键。因此,在索引操作中,您将拥有以下内容: 控制器代码:

def index
    @users = User.same_city_opp_gender_as(current_user)

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
end

型号代码:

def self.same_city_opp_gender_as(user)
  Rails.cache.fetch("users/#{user.city}/#{user.gender}"){ User.where(city: user.city).where(gender: user.gender).order(:updated_at) }
end

此外,用户类必须提供城市和性别方法。 对于3个城市(A,B,C)和2个性别(M,F),您将获得6个带有以下键的缓存:

  • “users / A / M”
  • “users / A / F”
  • “users / B / M”
  • “users / B / F”
  • “用户/ C / M”
  • “用户/ C / F”

因此,每次调用same_city_opp_gender_as都会在未命中时生成新缓存,或者在缓存存在时获取值。考虑缓存过期并阅读https://devcenter.heroku.com/articles/building-a-rails-3-application-with-memcache