2013-02-16 72 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