2013-02-16 54 views
0

我想我很瞭解投票的概念。您基本上只是從服務器請求數據,但只有數據發生更改後,服務器纔會返回數據。直接的東西。我的問題伴隨着這個例子。做長期民意調查時,你會發布舊數據嗎?

比方說,我拍賣的數據不斷變化。在這個數據就像

  • 事情關閉拍賣的時間
  • 當前投標人的數量在拍賣

當我開始長輪詢,我基本上是這樣的:

while($counter < $MESSAGE_TIMEOUT_SECONDS) { 
    $newData = getNewData(); 
    $hasDataChanged = hasDataChanged($newData, $oldData); 
    if ( $hasDataChanged ) { 
    return $newData; 
    } 

    usleep($MESSAGE_POLL_MICROSECONDS); 

} 

我從哪裏得到舊數據?我的意思是,在做請求時,我可以將當​​前狀態發佈給我,也可以將數據存儲在Session中。當我進行長時間輪詢時,我是否允許將內容存儲在會話中,或者我應該使用該頁的當前狀態從Javascript進行POST嗎?

此外,我會如何阻止某人打開50頁殺死數據庫?我的意思是,getNewData()有效地進入數據庫。如果輪詢時間間隔大約爲半秒,這可能意味着每半秒鐘發出50個請求,如果他決定打開50個標籤,這可能意味着僅由一名用戶在30秒內向數據庫發送50 x 2 x 30 = 3000個請求?

任何想法?

回答

0

我會將所有ajax響應數據與每次拍賣有任何變化的最後日期一起緩存,因此您不必比較新舊數據,只需要日期時間。針對拍賣的某些更改(關閉,新出價等)使緩存無效。

然後從客戶端發送最後一次已知數據的時間(最後一次Ajax調用或用戶打開頁面時)並比較日期以查看是否有更改,如果它不僅返回狀態:nochange(現在客戶端知道存在沒有更新),並且它確實從緩存和更新用戶頁面返回了所有必要的數據。

該模型應該保護數據庫免於重載。

+0

那麼你會如何阻止一個人打開10個窗口,並有效地啓動長期民意調查10次?還是20倍?當然,你必須跟蹤他訪問數據庫的頻率如何? – coderama 2013-02-16 18:05:46

+0

如果將數據緩存在內存中,它根本不會影響數據庫。 – 2013-02-16 18:12:14