【问题标题】:Rails Caching Strategy for Index action索引操作的 Rails 缓存策略
【发布时间】:2013-07-28 06:46:49
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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
    

    User 类也必须提供 city 和 gender 方法。 对于 3 个城市(A、B、C)和 2 个性别(M、F),您将获得 6 个具有以下键的缓存:

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

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

    【讨论】:

    • 你通过城市和性别来获取功能。它们用于制作缓存键。如果 store 中有这样的 key,rails 将在没有 db 查询的情况下返回其值,否则它将运行块并将返回值保存到 store。
    • 它显示它正在缓存,但它正在重新运行查询。此外,它并没有真正缓存,因为如果结果在 5 分钟内更新,它就会显示更新。
    • @pratski 你有没有安装和设置内存缓存?尝试不带 expire_in 参数的 Rails.cache。阅读我上面提到的文章。你最初的问题是关于缓存策略的,我没有意识到它。如果您在设置时遇到问题 - 创建新问题
    • 我已经安装了 Memcache。它实际上正在为我的另一项行动工作。您认为这与分页有关吗?
    • 回形针?我不明白你说的。这个 gem 是用来存储文件的,不是用来缓存的
    猜你喜欢
    • 2012-03-07
    • 2010-10-06
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2012-09-05
    • 2020-08-03
    • 2011-11-12
    • 2011-01-18
    相关资源
    最近更新 更多