在秒殺方援、搶火車(chē)票等地方偷办,我們通常用遇到這樣高并發(fā)的問(wèn)題背捌,下面我提供了四種解決方案:
1癌刽、使用文件鎖
$fp=fopen("order.lock","r");
if(flock($fp,LOCK_EX)){
//..處理訂單的代碼
flock($fp,LOCK_UN);
}
fclose($fp);
————————————————————————————————————————————————————————
2力图、使用消息隊(duì)列
我們常用到Memcacheq步绸、Radis。
比如:有100張票可供用戶(hù)搶?zhuān)敲淳涂梢园堰@100張票放到緩存中吃媒,讀寫(xiě)時(shí)不要加鎖瓤介。 當(dāng)并發(fā)量大的時(shí)候,可能有500人左右搶票成功赘那,這樣對(duì)于500后面的請(qǐng)求可以直接轉(zhuǎn)到活動(dòng)結(jié)束的靜態(tài)頁(yè)面刑桑。進(jìn)去的500個(gè)人中有400個(gè)人是不可能獲得商品的。所以可以根據(jù)進(jìn)入隊(duì)列的先后順序只能前100個(gè)人購(gòu)買(mǎi)成功募舟。后面400個(gè)人就直接轉(zhuǎn)到活動(dòng)結(jié)束頁(yè)面祠斧。當(dāng)然進(jìn)去500個(gè)人只是舉個(gè)例子,至于多少可以自己調(diào)整拱礁。而活動(dòng)結(jié)束頁(yè)面一定要用靜態(tài)頁(yè)面琢锋,不要用數(shù)據(jù)庫(kù)。這樣就減輕了數(shù)據(jù)庫(kù)的壓力呢灶。
—————————————————————————————————————————————————————————
3吴超、如果是分布式集群服務(wù)器,就需要一個(gè)或多個(gè)隊(duì)列服務(wù)器
小米和淘寶的搶購(gòu)還是有稍許不同的鸯乃,小米重在搶的那瞬間鲸阻,搶到了名額,就是你的缨睡,你就可以下單結(jié)算鸟悴。而淘寶則重在付款的時(shí)候的過(guò)濾,做了多層過(guò)濾奖年,比如要賣(mài)10件商品细诸,他會(huì)讓大于10的用戶(hù)搶到,在付款的時(shí)候再進(jìn)行并發(fā)過(guò)濾拾并,一層層的減少一瞬間的并發(fā)量揍堰。
—————————————————————————————————————————————————————————
4、使用Memcache鎖
product_lock_key 為票鎖key
當(dāng)product_key存在于memcached中時(shí)嗅义,所有用戶(hù)都可以進(jìn)入下單流程。
當(dāng)進(jìn)入支付流程時(shí)隐砸,首先往memcached存放add(product_lock_key, “1″),如果返回成功之碗,進(jìn)入支付流程。如果不成季希,則說(shuō)明已經(jīng)有人進(jìn)入支付流程褪那,則線(xiàn)程等待N秒幽纷,遞歸執(zhí)行add操作。