2011-12-16 26 views
1

我正在尋找一個實時計數器,該計數器隨着更多數據庫條目(銷售)的創建而更新(例如,http://www.humblebundle.com)。我試圖不對數據庫造成不必要的壓力。像Humble Bundle這樣的實時銷售櫃檯?

一個幼稚的方式來做到這一點,只是每秒鐘ping數據庫的銷售計數,並實時更新數字與JavaScript。這會給數據庫帶來太大的壓力,並且不可行,但這是我試圖實現的基本效果。

我能想到的另一種方法是以某種方式將銷售代碼存儲在緩存中而不是數據庫中,然後在每次銷售時向此緩存中添加+1。然後,計數器每秒鐘用緩存計數的新值更新。這似乎可能會更好,但我不知道如何在Rails中實現這個功能。

我在Heroku上使用Rails 3.1和jQuery,但我主要只是尋找一個高層次的方式來做到這一點。當然,更多的細節你可以提供更好的:)

回答

3

這不是緩存問題,而是數據去歸一化問題。如果你有一個正確的值的記錄,讀出這個值是微不足道的,即使每秒完成數百次也不會花費時間。你可以對它進行基準測試。

它通常是很容易,你玩弄一些值與after_create鉤來做到這一點:

after_create :update_sales_total 

def update_sales_total 
    # Update the simple summary record 
    SalesTotal.update([ 'total=total+?', self.total ]) 
end 

如果您需要緩存,因爲數據庫性能不理想,使用Rails.cache設施與內存緩存的存儲,以便這些數據在Rails的實例之間共享。每次錄製銷售時,將適當的金額添加到緩存的值。如果緩存未填充,請從數據庫中提取總和。

0

緩存的想法是最好的。您可以輕鬆地緩存每5分鐘左右的當前銷售量,並開始生成所有輪詢值的數據集。您可以使用該數據集來生成平均銷售率,並根據低於估計銷售率的速度自動增加銷售計數器,並每5分鐘對緩存進行一次實際輪詢。 count(*)實際上並不是一個緩慢的操作,在postgresql中,至少我不認爲它需要從字面上掃描所有元素,如果你沒有高級過濾器。

+0

每五分鐘聽起來不是很實時。 – tadman 2011-12-16 17:10:08

+0

JavaScript的估計給予了實時的感覺,而沒有經常查詢的性能。但是再次查詢可能很容易到一個文件,所以它只是一個普通的http請求。一個cron工作很容易做一個計數。 – 2011-12-16 17:11:37