2013-04-15 85 views
1

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

这是关于搜索查询的一个例子:

@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

你肯定可以使用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缓存来处理任何类型的非平凡内容以从其原始源查找(即,如果涉及数据库查询)。

过程中非常重要的考虑因素要记住的是缓存过期:如果/当你添加新的记录到你的数据库与您在您的高速缓存有数据的标准,你必须确保到期手动缓存中的数据,或者在缓存中设置自动过期时间,以便它最终将自行清除并刷新。

Rails中使用Memcached的,高速缓存的手动期满涉及delete

Rails.cache.delete(key) 

或者使用自动到期,使用:expires_in选项:

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

这是有道理谢谢。如果你有一分钟​​可以提供一些什么时候缓存和什么时候不缓存的例子?例如,我的用户有配置文件。使用片段缓存用户的个人资料是另一个可能的候选人吗?这是关于提高表现的权利? – Brian

+0

此外,在上面的代码中,我将如何将查询的结果添加到基于密钥的缓存中? – Brian

+0

我已经更新了我的答案,其中包含一些更详细的信息,包括缓存过期非常重要 –