網(wǎng)頁一般是單向主動短鏈接,實時更新實在有些不便,即使一方掉線,另一方也不能及時感知。一般所謂的實時刷新,大多采用定時刷新(輪詢),或長輪詢的方式做,ajax用于更新數(shù)據(jù)確實是比較簡單方便的。
創(chuàng)新互聯(lián)公司是一家成都網(wǎng)站制作、網(wǎng)站建設,提供網(wǎng)頁設計,網(wǎng)站設計,網(wǎng)站制作,建網(wǎng)站,定制網(wǎng)站開發(fā),網(wǎng)站開發(fā)公司,2013年至今是互聯(lián)行業(yè)建設者,服務者。以提升客戶品牌價值為核心業(yè)務,全程參與項目的網(wǎng)站策劃設計制作,前端開發(fā),后臺程序制作以及后期項目運營并提出專業(yè)建議和思路。
輪詢你就settimeout,長輪詢你就每次接收數(shù)據(jù)成功后,再來一次長輪詢。但你鏈接別人的數(shù)據(jù),了解一下供應商的刷新機制、周期再做考慮。
當然這些都是偽實時,真的實時用http協(xié)議是不合適的,你得用flash插件做。而你用的是api供應商的東西,這條路就基本走不通了。
不刷新頁面更新數(shù)據(jù),一般有兩個方法實現(xiàn),都離不開JAVASCRIPT?,F(xiàn)在最流行的就是AJAX,是用JS腳本連接數(shù)據(jù)庫更新數(shù)據(jù),刷新頁面部分區(qū)域內(nèi)容,不刷新整個網(wǎng)頁。另外一個是比較經(jīng)典、但是兼容性更高的方法,設置一個隱藏的FRAME或者iFRAME幀,那個幀不斷刷新PHP頁面,頁面內(nèi)容為改變可見幀內(nèi)容的JS。
以前我用過querylist插件抓數(shù)據(jù),服務器寫和定時器,每天固定時間去運行腳本。朝這個方式試試
高并發(fā)下數(shù)據(jù)的更新,應該 update table xxx set num = num - 1 的方式,這種方式可以保證數(shù)據(jù)的正確性。
但是會出現(xiàn) num 為負數(shù)的問題,如果庫存為負數(shù),顯然是不合理的。
于是,需要將 num 字段設置為 無符號整型,這樣就不會出現(xiàn)負數(shù)了,因為,如果減到負數(shù),就會更新失敗。
但是這種依然會造成很多無用的更新語句的執(zhí)行,是不合理的。
于是,update table xxx set num = num - 1 where num 0,
這樣當 num 等于0之后就不會去更新數(shù)據(jù)庫了,減少了很多無用的開銷。
這種方式被稱作“樂觀鎖”
此外,對于搶紅包這種非整數(shù)的操作,我們應該轉(zhuǎn)換為整數(shù)的操作。
關于搶購超賣的控制
一般搶購功能是一個相對于正常售賣系統(tǒng)來說獨立的子系統(tǒng),這樣既可以防止搶購時的高并發(fā)影響到正常系統(tǒng),
也可以做到針對于搶購業(yè)務的特殊處理。
在后臺設計一些功能,可以就昂正常的商品加入到搶購活動中并編輯成為搶購商品,寫入到搶購商品表,當然
也可以把搶購商品表寫入redis而不是數(shù)據(jù)表。并且在原商品表寫入一個同樣的商品(id相同,用于訂單查看,
此商品不可購買)
如果是數(shù)據(jù)表,為了控制超賣,需要對表進行行鎖,更新的時候帶上 where goods_amount 0。
如果是redis,使用 hincrby 一個負數(shù)來減庫存,并且 hincrby 會返回改變后的值,再來判斷返回值是否大于0,
因為redis每個命令都是原子性的,這樣不用鎖表就可控制超賣。
有兩種實現(xiàn)方法:
1、你可以用PHP服務器推技術(shù),當數(shù)據(jù)發(fā)生變化時,主動推送到頁面顯示。相關技術(shù)可以參考文檔。百度也很多。
2、你可以用Javascript,每過一秒鐘,使用Ajax獲取數(shù)據(jù),一秒鐘刷新一次,也可以實現(xiàn)的。
第一種我也不會。第二種相信你可以的。
while的話是循環(huán),你用了只會一行行加