2012-07-27 120 views
0

我有一個查詢需要大約一分鐘才能完成,因爲它處理大量數據,但我也想將結果放到網站上。顯而易見的結論是緩存它(對嗎?),但隨着時間的推移數據會發生變化,我需要一種方法來每隔24小時自動重新創建緩存頁面。尋找類似緩存的東西

有人可以指點我該怎麼做?

編輯:我想做一個「前10」類型的東西,所以它不顯示問題的頁面,但查詢運行所花費的時間量。

+0

緩存+ cron ... – apneadiving 2012-07-27 22:13:54

回答

0

用24小時TTL(過期)緩存查詢的結果可能會正常工作。假設這是一個頁面塊,請使用片段高速緩存。

您可以按照陳述設置memcached或redis來存儲緩存。你可以做的另一件事是設置一個作業,每24小時(或根據需要)加熱緩存,這樣不幸的用戶就不必爲你生成緩存。

如果您知道緩存何時過期(基於數據庫中的狀態或更改),則可以基於此過期緩存。很多時候,我使用創建或更新的字段作爲緩存鍵的一部分來協助完成此過程。

嫉妒實驗室和新遺物在縮放導軌屏幕錄像中有一些好東西。 http://railslab.newrelic.com/scaling-rails,有點過時,但原則仍然相同。

此外,結帳高速緩存導軌指南。http://guides.rubyonrails.org/caching_with_rails.html

最後,確保索引正確安裝,使用thoughtbots張貼在這裏:http://robots.thoughtbot.com/post/163627511/a-grand-piano-for-your-violin

輸入我的手機上,以便道歉錯別字。

0

想一想超出查詢。如果您的目標是允許用戶查看大量數據,那麼可以根據需要抓取這些數據,而不是用一種會讓您的用戶界面不堪重負的怪異查詢來對抗。結果不僅看起來更好,而且速度更快。

我個人對這種模式的技巧是DataTables。這是一個網格,允許您使用Ajax查詢(內置)來從您的查詢中獲取數據,這個數據塊是用戶希望查看的時間塊。它可以對代碼進行排序,頁面,篩選,限制,甚至搜索。它甚至有一個插件來將結果導出爲ex​​cel,pdf等。

Datatables最大的問題是其他人沒有的概念叫做「流水線」,它允許你得到一個數量來顯示(比如說20)加上額外的金額向前和/或向後。這使您仍然可以進行可管理的查詢,但不必每次用戶點擊「下一頁」時都要點擊數據庫。

我有一個處理數百萬條記錄的應用程序。所有數據的一個查詢將是不可能的......這將花費太長時間。然而,每次抓取25個,閃電般快,不需要任何技巧。一旦數據表上來,我只是表現調整了我的查詢,在需要的地方做了一些索引,並且瞧......偉大的響應式應用程序。

這裏有一個簡單的例子:

<table id="example"></table> 

$('#example').dataTable({ 
    "bProcessing": true, 
    "bServerSide": true, 
    "sAjaxSource": "/processing/file.php" 
}); 
+0

不認爲這是我需要的。在我的情況下,每隔幾分鐘就會向表中添加新數據,因此我的查詢返回的平均值可能會每次給我不同的數字。 – Julian 2012-07-27 22:57:53

+0

頁面上的自動更新/更新總計很瑣碎....重點是您只能在顯示UI時獲取UI所需的數據。如果你有一個需要幾分鐘的查詢,它要麼抓取大量的數據,要麼是效率非常低。我可以對包含數百萬條記錄的表進行復雜的連接,並且仍然可以在5秒內響應用戶界面。 – bpeterson76 2012-07-27 23:03:02

+0

抱歉,這是我的錯,我沒有足夠好地描述我的問題。我正在處理前10名列表,所以不是我顯示大量數據,而是從數百萬行中提取前10名是問題所在。 – Julian 2012-07-27 23:06:54

0

使用高速緩存存儲區,允許在一定時間後自動失效。

Memcached做到了,Redis也是我猜!

+0

是的,redis肯定會這樣做。 – 2012-07-29 19:35:33