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