大家應(yīng)該都知道,秒殺為啥 用 異步隊(duì)列 這種形式來(lái)處理吧?哈哈 因?yàn)槲覀儗?xiě)的程序功能之前常理都是 用戶(hù)請(qǐng)求到后臺(tái),后臺(tái)操作數(shù)據(jù)庫(kù)進(jìn)行實(shí)現(xiàn)相應(yīng)功能。
上邊說(shuō)道 用戶(hù) --> 后臺(tái)服務(wù)器邏輯 -->數(shù)據(jù)庫(kù)
那么這樣的模式 如果用在秒殺上, 同時(shí)間 高并發(fā)來(lái)臨,后臺(tái)服務(wù)器邏輯操作數(shù)據(jù)庫(kù) 一定是數(shù)據(jù)庫(kù) 扛不住的時(shí)候,他已經(jīng)就高潮了信不?
所以我們 如何讓服務(wù)器不癱瘓的實(shí)現(xiàn)秒殺咧?
就要使用我們 的一種快、高效 避免數(shù)據(jù)庫(kù)受到 高并發(fā)的請(qǐng)求處理;
實(shí)現(xiàn)思路:
1、在做一個(gè) 商品 開(kāi)啟秒殺活動(dòng)前,將數(shù)據(jù)庫(kù)中該商品的庫(kù)存 同步到我們的內(nèi)容緩沖中例如 redis 、memcache 中;
2、然后 同時(shí)在redis、memcache內(nèi)容緩沖中 構(gòu)建我們的消息隊(duì)列A(其實(shí)也就是一塊命名了的 資源空間) 用來(lái)存放 客戶(hù)端的請(qǐng)求;
3、構(gòu)建 處理 2 中的隊(duì)列數(shù)據(jù) 將處理的結(jié)果 放入另一個(gè) 隊(duì)列B中(例如 通過(guò)腳本 while() sleep 實(shí)現(xiàn)隊(duì)列A處理后 結(jié)果再放入隊(duì)列B);
4、客戶(hù)端點(diǎn)擊秒殺后,js等客戶(hù)端 啟動(dòng)隔時(shí) 請(qǐng)求,去隊(duì)列B中找自己是不是被處理 以及處理的結(jié)果到底是個(gè)毛線 拿回來(lái);
5、定時(shí)將 緩沖 中的商品庫(kù)存等信息 再同步回?cái)?shù)據(jù)庫(kù)中
OK 幾句話是否點(diǎn)通了你?
實(shí)現(xiàn)腳本圖:
0.php 將數(shù)據(jù)庫(kù)商品庫(kù)存同步 緩沖中一份;
1.php 處理消息隊(duì)列A 的入隊(duì)(用戶(hù)的請(qǐng)求);
2.php while sleep腳本啟動(dòng),出隊(duì)A中的請(qǐng)求逐個(gè)處理 并將結(jié)果存入隊(duì)列B;
3.php 處理客戶(hù)端 定時(shí)請(qǐng)求讀取結(jié)果 隊(duì)列B中檢索;
4.html 定時(shí)請(qǐng)求3.php;
5.php 定時(shí)將緩沖商品信息同步回?cái)?shù)據(jù)庫(kù)中
OK
以上,自己實(shí)現(xiàn)過(guò)一個(gè)例子,僅供參考
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注