1

我正在考虑将 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 的可能候选者,但我不确定。

请提供方向。

4

1 回答 1

1

您当然可以使用 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)
于 2013-04-15T06:19:56.567 回答