代码之家  ›  专栏  ›  技术社区  ›  Brian

Rails Memcached使用情况

  •  1
  • Brian  · 技术社区  · 12 年前

    我正在考虑将memcached用于我的rails应用程序。我曾考虑在我的会员搜索中使用它,但我很困惑,因为搜索有多个参数,这些参数会随着用户选择而改变。

    这是一个用于搜索的查询示例:

     @results = Painter.city(params[:city].downcase).state(params[:state]).tools(tools).transportation(trans).travel_distance(params[:travel_distance]).insurance(insurance).employee(emp).subcontractor(sub).available(true).paginate(:page => params[:page], :per_page => 20).where("premium = ? AND banned = ?", false, false).order('last_name')
    

    这似乎是memcached的一个可能的候选者,但我不确定。

    请提供方向。

    1 回复  |  直到 12 年前
        1
  •  1
  •   Stuart M    12 年前

    你当然可以使用Memcached来缓存这个。您必须首先决定您的 缓存密钥 ,并且当您有几个不同的条件/字段来唯一地确定缓存记录时(例如在您的情况下),您可能只需要按照预先确定的顺序将它们连接起来,使用某种字符串来分隔它们。例如,您的缓存密钥可能如下所示:

    @results = Rails.cache.fetch([params[:city].downcase,
                       params[:state],
                       tools,
                       trans,
                       params[:travel_distance],
                       insurance,
                       emp,
                       sub,
                       params[:page]
                      ].join('/')) do
      Painter.city(params[:city].downcase)...  # rest of your query
    end
    

    你可能想调整或清理格式,但要点是你必须能够计算 一致的 缓存键作为字符串。对于多个字段,最简单的方法是 join 使用分隔符(我选择 / ,但如果您愿意,也可以使用其他分隔符。)

    还请注意,我遗漏了 :per_page => 20 ,因为这是在控制器代码中硬编码的,不会因用户输入而变化。如果您决定允许用户自定义返回的记录数,则还需要将其包含在缓存密钥中。同样适用于 where("premium = ? AND banned = ?", false, false) 条款,以及 available(true) .

    您可以对任何类型的内容使用Rails缓存,这些内容从其原始源(即,如果涉及DB查询)中查找都是不平凡的。

    当然,需要记住的一个非常重要的考虑因素是 缓存终止 :如果/当您向数据库中添加符合缓存中数据标准的新记录时,必须确保 失效 手动缓存中的数据,或者在您 write 到缓存,以便它最终将被清除并自行刷新。

    使用Rails中的Memcached,缓存的手动过期需要 delete :

    Rails.cache.delete(key)
    

    或者要使用自动过期,请使用 :expires_in 选项:

    Rails.cache.write(key, value, :expires_in => 1.minute)