0

我有一個Rails 4.1應用程序,它在特定頁面上檢索訂單列表並在表格中列出它們。請務必注意,根據登錄的用戶,列表不同。集合的Rails碎片緩存

爲了提高性能,我正在尋找緩存每個訂單行的部分。我正在考慮做這樣的:

_order_list.html.erb

<% cache(@orders) do %> 
    <%= render @orders %> 
    <% end %> 

_order.html.erb

<% cache(order) do %> 
    ...view code for order here 
<% end %> 

不過,我不確定緩存(@orders)。那麼所有的用戶都會得到相同的一組緩存@order(這是不需要的)嗎?

換句話說,我如何確保爲每個用戶分別緩存@orders的整個集合?

回答

2

那麼所有的用戶都會被送到同一組緩存@order( 不需要)嗎?

其實​​不緩存@orders自己。它緩存html特定給定對象或對象集合的部分頁面(例如@orders)。每次用戶請求網頁時,將在控制器操作中設置@orders變量,並將其digest與緩存摘要進行比較。

因此,假設我們檢索@orders這樣的:

def index 
    @orders = Order.where(:id => [1,20,34]).all 
end 

我們會得到緩存觀點與這樣的郵票:

的意見/命令/ -20131202075718784548000 /訂單/ -20131220073309890261000/orders/-20131223112753448151000/6da080fdcd3e2af29fab811488a953d0

請注意,檢索訂單的ids在該郵票中被提及,因此每個擁有自己獨特訂單集的用戶都應該獲得他/她自己的單獨緩存視圖。

但在這裏談到你的做法的一些偉大的缺點:

  1. 頁面緩存總是存儲在磁盤上。這意味着您不能擁有任何所需長度的頁面戳。只要您一次檢索到大量的訂單,就會超出操作系統對文件名的限制(例如,對於Linux,它的長度爲255字節),並最終導致運行時錯誤。
  2. 訂單是動態內容。一旦至少有一個更新,您的緩存將變爲無效。生成緩存並將其保存到磁盤是相當耗時的操作,所以最好單獨緩存每個訂單。在這種情況下,您將不得不爲單個訂單重新生成緩存,而不是重新生成整個大規模集合的緩存。