2012-06-15 41 views
3

我有一個電子商務Rails應用程序,我們需要輸出客戶在過去一年內在頁面上放置的訂單,以便報告原因。現在,數據集非常大,並且在單個頁面上顯示這些訂單需要相當多的SQL處理。這個任務最初非常緩慢,因此我將所有必需的訂單詳細信息移到了Redis服務器上,現在數據的獲取變得非常快,但我們仍然沒有完成。改善鋼軌視圖渲染的性能

下面是我們所擁有的:

Rendered **path**/sales_orders.html.haml within layouts/admin (39421.1ms) 
Completed 200 OK in 44925ms (Views: 39406.8ms | ActiveRecord: 417.2ms) 

應用程序託管在Heroku上,如果一個請求花費超過30秒就被殺死。正如你所看到的,我們遠遠超過了這個限制。大部分時間都在渲染視圖時丟失了。

該頁面包含一個日期篩選器,用戶可以從中選擇要從中選擇訂單的日期範圍。因此,緩存不是理想的解決方案,因爲日期範圍可能每次都會更改。

任何想法如何做到這一點?

Redis的鍵格式(以下是Redis的哈希):

orders:2012-01-01:123 
orders:yyyy-mm-dd:$order-id 

用戶提供一個簡單的日期範圍,我得到的訂單命名空間下該日期範圍內的所有鍵。

下面我將如何獲得客戶名稱,例如從Redis的命令鍵:

= REDIS.hget(order_key, "customer_name") 
+0

提示1:使用分頁 –

+0

謝謝奧斯卡,其中一個驗收標準是不使用分頁 –

+1

那麼如果標準不使用分頁,那麼標準是它不起作用。爲了呈現44個視圖,必須在其上顯示大量的數據。這對客戶來說也很難,因爲他們的瀏覽器必須渲染巨大的頁面。您能否讓我們知道我們在此頁面上討論了多少條記錄?你的視圖代碼是什麼樣的?我只是覺得你不能指望任意的大型查詢總是快速顯示而沒有分頁或限制。 –

回答

2

考慮使用該插件Heroku Scheduler週期性任務生成報表。 只要最後一刻的訂單不需要包含在報告中,您就可以每晚創建報告並讓它們立即下載以便在早晨喝咖啡時閱讀,甚至可以將它們郵寄給您(或需要閱讀它們。)

如果您需要交互式選擇報告期間,則需要將請求排隊並使用background jobs構建報告。

+0

是的+1最好的事情是儘可能地預先渲染這些文檔 –

2

幾乎所有的時間都在渲染視圖中度過。這可能意味着你有很多偏見或其他複雜的視圖邏輯。您的部分選項爲:

  1. 爲輸出分頁,但爲未分頁的輸出提供PDF或CSV。
  2. 簡化您的視圖邏輯...很多。
  3. 嘗試像循環一樣的幫助,而不是渲染複雜的表或嵌套的部分。
  4. 使用JSON和JavaScript將您的渲染移動到客戶端。

就是這樣,真的。如果其中一個或多個不能將您帶到需要去的地方,可能是時候重新審視您的需求了。

2

我建議你使用片段緩存。閱讀一個片段非常快(〜0.5毫秒),根據我的經驗,不會一次又一次地重新渲染你的部分,你會看到巨大的加速增益。這也是一個相當便宜的解決方案,因爲Rails負責使片段無效(如果您使用該模型作爲緩存鍵的一部分)並且它只需要對模板進行微小的更改。即該解決方案可能是簡單:

<% @orders.each do |order| %> 
    <% cache ["v1", order] do %> 
    <%= render order %> 
    <% end %> 
<% end %>