2013-04-15 63 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

我已經更新了我的答案,其中包含一些更詳細的信息,包括緩存過期非常重要 –