av不卡网免费日韩精品黄色无码|三级黄色在线看高清视频片一片二|久草在在线视频五月丁香婷婷开心|日韩av无码综合先锋资源av男人|伊人导航精品色奇吧福利视频|五月丁香综合东京热久久步兵|秋霞毛片网站桃子视频网站|久久综合资源曰韩无码性爱

位置導航:首頁(yè) > 建站技術(shù) > 新聞詳情
關(guān)于PHP高并發(fā)搶購系統設計
作者:蜂巢建站      時(shí)間:2017-05-12 12:10:34      點(diǎn)擊:31953
內容
并發(fā)搶購系統注意事項
高并發(fā)架構設計描述
程序端核心代碼實(shí)現
訂單流程mysql 端并發(fā)解決方案


注意事項
(1)高并發(fā)環(huán)境下,對于服務(wù)器cup、內存、網(wǎng)絡(luò )寬帶使用率會(huì )瞬間暴漲,需要注意對同服務(wù)器上其他應用的影響。(項目解耦,高并發(fā)應用獨立部署)
(2)服務(wù)器高負載運行,容易出現死機,重啟服務(wù)器場(chǎng)景,要提前考慮內存(redis)數據備份與恢復,防止用戶(hù)搶購數據丟失.
(3)高并發(fā)應用首先要注重穩定性,其次是性能上優(yōu)化.


(4) 一臺服務(wù)器能夠支持多少并發(fā)量
nginx服務(wù)為例:
worker_processes 8;
worker_rlimit_nofile 102400;
use epoll;
worker_connections 102400;
ulimit -n
cat /proc/sys/fs/file-max 


架構設計

(1)LVS服務(wù), 做負載均衡調度, 采用RD模式, 通過(guò)股修改數據包的目的MAC地址實(shí)現轉發(fā),該方式性能好, 對并發(fā)高應用,適合大規模部署負載均衡機器;抗負載能力強、是工作在網(wǎng)絡(luò )4層僅作分發(fā)之用,沒(méi)有流量的產(chǎn)生;工作穩定,自身有完整的雙機熱備方案
(2)keepalive(vrrp協(xié)議方式) 做心跳檢測,支持應用具有高可用性。
(3)nginx工作在網(wǎng)絡(luò )的7層,所以它可以針對http應用本身來(lái)做分流策略, 可用說(shuō)對LVS負載的補充。nginx高效處理高并發(fā)請求在于采用異步非阻塞工作方式和epoll IO 模型。  
(4)頁(yè)面動(dòng)態(tài)數據,用戶(hù)數據,搶購商品數據采用Redis存儲。
(5)用戶(hù)搶購記錄標識存儲在Redis服務(wù)器端。在nginx負載均衡端,應用lua腳本做用戶(hù)搶購記錄過(guò)濾。
(6)real server端部署 nginx與php, 同時(shí) real server 可以參與負載端調度。
(7)mysql server cluster 端采用一主多從部署,master負載數據寫(xiě)及同步到slave, slave負責數據讀取。推薦應用mysql代理組件atlas, 實(shí)現對php端對mysql讀寫(xiě)透明操作。
核心代碼實(shí)現
背景
假設每個(gè)用戶(hù)只允許搶購一件商品。
預備數據
搶購商品總數存入redis中, 比如十萬(wàn)個(gè)數據
$redisObj = new redis();
$redisObj->set('goods_amount', 1000000);
$redis->watch('goods_amount'); //應用redis watch 樂(lè )觀(guān)鎖
$amount = $redis->get('goods_amount');
if($amount > 0)
{
 $userInfo = $reids->get('user_info_crc32(url_token)', array('userId'=>120, '....')); 
 
  if(empty($userInfo)){
      
        $ret = $redis->multi() ->decr('goods_amount') ->exec();
      if($ret){
$reids->set('user_info_crc32(url_token)', array('userId'=>120, '....')); 
       根據crc32(url_token)唯一索引創(chuàng )建改用戶(hù)已搶過(guò)商品的標識。(同時(shí)標識可以設置一段時(shí)間有效期,例如10分鐘);
    
write("user_id", {user_id}_success.log);
      }else {
                //提示搶購失敗 
    }
 } else {
    $redis->unwatch(‘goods_amount');
    //提示搶購失敗 
} else {
    //搶購結束, 封閉入口
}
}


(1)下一個(gè)搶購請求到來(lái)時(shí),在nginx服務(wù)器lua端,檢查googs_amount搶購商品數量,判斷搶購有沒(méi)有結束,在判斷user_info_crc32(url_token)有沒(méi)有搶過(guò)成功,如果成功跳轉到下單頁(yè)面,否則執行搶過(guò)流程。
(2)搶購首頁(yè)直接高并發(fā)靜態(tài)資源存儲在cdn 服務(wù)端, 來(lái)減輕服務(wù)端訪(fǎng)問(wèn)請求的壓力
mysql端并發(fā)解決
(1)搶購商品數據預熱,提前存儲在redis中,比如商品名稱(chēng),屬性等等。
(2)采用innodb 數據庫引擎,在高并發(fā)場(chǎng)景讀操作有優(yōu)勢,合理創(chuàng )建表結構,盡可能的減少鏈表查,可以適當設計表中冗余字段,sql查詢(xún)能夠必須走索引。
(3)用戶(hù)瀏覽商品詳情頁(yè)(需要在redis端做動(dòng)態(tài)數據緩存) 
(4)用戶(hù)點(diǎn)擊購買(mǎi)跳轉到訂單詳情頁(yè)(包括用戶(hù)基本信息,商品信息,支付方式,積分消費等數據考慮對數據庫并發(fā)查詢(xún)壓力,要采用redis緩存策略)
(5)訂單數據提前生成,user_id留空,同時(shí)通過(guò)redis lpush,把連續訂單id,提前同步到redis分布式集群,redis集群支持心調檢測,能夠自動(dòng)做服務(wù)奔潰切換。
(6)用戶(hù)提交訂單后,  在redis服務(wù)l(shuí)pop拿到一個(gè)訂單id, 根據訂單id條件更新用戶(hù)user_id等信息。
   begin;
   update mt_account set user_id=100 where order_id=$orderId and user_id=0 li mit 1;
   commit;
正品保證 蜂巢直供,技術(shù)保障
急速響應 7*24專(zhuān)業(yè)人員值班
無(wú)憂(yōu)售后 服務(wù)不滿(mǎn)意,任性退款
特色服務(wù) 私人定制建站套餐
幫助中心 常規操作指南
赣榆县| 兴仁县| 华容县| 中宁县| 府谷县| 芦山县| 闽清县| 乡宁县| 宁晋县| 台江县| 大兴区| 明光市| 宁阳县| 延安市| 舟曲县| 乐东| 昭通市| 梓潼县| 商河县| 奉化市| 出国| 黔南| 瓦房店市| 屏边| 苏州市| 荃湾区| 微博| 金溪县| 屏山县| 布拖县| 怀仁县| 新闻| 喜德县| 安吉县| 东丰县| 康平县| 富锦市| 江油市| 青海省| 枣强县| 黑龙江省|