2014-12-21 79 views
0

我在我的Rails應用程序了查詢並不需要很長時間來運行(〜180ms的),但不會返回了不少成果。結果在API中使用,結果轉換爲JSON的代價很高(大約3秒)。爲了加快速度,我這樣緩存:Rails的:無效基於查詢的緩存結果

key = 'new_prices' 
query = Prices.new_this_month.where('...') 
json = cache(key, expires_in: 60.minutes) do 
    render_to_string json: query, each_serializer: PriceSerializer 
end 
render json: json 

在後臺可以將新價格添加到數據庫中。我怎樣才能生成如果query變化的結果,緩存失效這樣的緩存鍵?

我通過dalli寶石使用Rails 3.2,與memcached的。

回答

0

因爲你有new_this_month範圍,我假設Prices有一個created_at時間戳。在這種情況下,你可以簡單地在你的緩存鍵使用最新created_at

cache_key = "new_prices-#{Prices.order('created_at DESC').take.created_at}" 

如果你有在地方良好的數據庫索引,這應該是一個非常快速的查詢。

+0

它實際上並沒有一個'created_at'日期,但可以推斷出來。我也認爲我說得對,如果價格變化,緩存不會失效? (我沒有'modified_at') –

+0

是的假設是正確的。雖然你沒有在你的問題中提到這個。確實需要一種方法來確定自上次碎片緩存後價格是否已更新。否則,你唯一的選擇是手動使緩存失效。 – fivedigit