日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 數據庫 > Redis > 正文

php結合redis實現高并發(fā)下的搶購、秒殺功能的實例

2020-10-28 21:38:18
字體:
來源:轉載
供稿:網友

搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個:

1 高并發(fā)對數據庫產生的壓力

2 競爭狀態(tài)下如何解決庫存的正確減少("超賣"問題)

對于第一個問題,已經很容易想到用緩存來處理搶購,避免直接操作數據庫,例如使用Redis。

重點在于第二個問題

常規(guī)寫法:

查詢出對應商品的庫存,看是否大于0,然后執(zhí)行生成訂單等操作,但是在判斷庫存是否大于0處,如果在高并發(fā)下就會有問題,導致庫存量出現負數

<?php$conn=mysql_connect("localhost","big","123456"); if(!$conn){ 	echo "connect failed"; 	exit; } mysql_select_db("big",$conn); mysql_query("set names utf8");$price=10;$user_id=1;$goods_id=1;$sku_id=11;$number=1;//生成唯一訂單function build_order_no(){  return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);}//記錄日志function insertLog($event,$type=0){	global $conn;	$sql="insert into ih_log(event,type) 	values('$event','$type')"; 	mysql_query($sql,$conn); }//模擬下單操作//庫存是否大于0$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";//解鎖 此時ih_store數據中goods_id='$goods_id' and sku_id='$sku_id' 的數據被鎖住(注3),其它事務必須等待此次事務 提交后才能執(zhí)行$rs=mysql_query($sql,$conn);$row=mysql_fetch_assoc($rs);if($row['number']>0){//高并發(fā)下會導致超賣	$order_sn=build_order_no();	//生成訂單 	$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) 	values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; 	$order_rs=mysql_query($sql,$conn); 		//庫存減少	$sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";	$store_rs=mysql_query($sql,$conn); 	if(mysql_affected_rows()){ 		insertLog('庫存減少成功');	}else{ 		insertLog('庫存減少失敗');	} }else{	insertLog('庫存不夠');}?>

優(yōu)化方案1:將庫存字段number字段設為unsigned,當庫存為0時,因為字段不能為負數,將會返回false

 

//庫存減少$sql="update ih_store set number=number-{$number} where sku_id='$sku_id' and number>0";$store_rs=mysql_query($sql,$conn); if(mysql_affected_rows()){ 	insertLog('庫存減少成功');}

優(yōu)化方案2:使用MySQL的事務,鎖住操作的行

<?php$conn=mysql_connect("localhost","big","123456"); if(!$conn){ 	echo "connect failed"; 	exit; } mysql_select_db("big",$conn); mysql_query("set names utf8");$price=10;$user_id=1;$goods_id=1;$sku_id=11;$number=1;//生成唯一訂單號function build_order_no(){  return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);}//記錄日志function insertLog($event,$type=0){	global $conn;	$sql="insert into ih_log(event,type) 	values('$event','$type')"; 	mysql_query($sql,$conn); }//模擬下單操作//庫存是否大于0mysql_query("BEGIN");	//開始事務$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' FOR UPDATE";//此時這條記錄被鎖住,其它事務必須等待此次事務提交后才能執(zhí)行$rs=mysql_query($sql,$conn);$row=mysql_fetch_assoc($rs);if($row['number']>0){	//生成訂單 	$order_sn=build_order_no();		$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) 	values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; 	$order_rs=mysql_query($sql,$conn); 		//庫存減少	$sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";	$store_rs=mysql_query($sql,$conn); 	if(mysql_affected_rows()){ 		insertLog('庫存減少成功');		mysql_query("COMMIT");//事務提交即解鎖	}else{ 		insertLog('庫存減少失敗');	}}else{	insertLog('庫存不夠');	mysql_query("ROLLBACK");}?>

優(yōu)化方案3:使用非阻塞的文件排他鎖

<?php$conn=mysql_connect("localhost","root","123456"); if(!$conn){ 	echo "connect failed"; 	exit; } mysql_select_db("big-bak",$conn); mysql_query("set names utf8");$price=10;$user_id=1;$goods_id=1;$sku_id=11;$number=1;//生成唯一訂單號function build_order_no(){  return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);}//記錄日志function insertLog($event,$type=0){	global $conn;	$sql="insert into ih_log(event,type) 	values('$event','$type')"; 	mysql_query($sql,$conn); }$fp = fopen("lock.txt", "w+");if(!flock($fp,LOCK_EX | LOCK_NB)){	echo "系統(tǒng)繁忙,請稍后再試";	return;}//下單$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";$rs=mysql_query($sql,$conn);$row=mysql_fetch_assoc($rs);if($row['number']>0){//庫存是否大于0	//模擬下單操作 	$order_sn=build_order_no();		$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) 	values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; 	$order_rs=mysql_query($sql,$conn); 		//庫存減少	$sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";	$store_rs=mysql_query($sql,$conn); 	if(mysql_affected_rows()){ 		insertLog('庫存減少成功');		flock($fp,LOCK_UN);//釋放鎖	}else{ 		insertLog('庫存減少失敗');	} }else{	insertLog('庫存不夠');}fclose($fp);

優(yōu)化方案4:使用redis隊列,因為pop操作是原子的,即使有很多用戶同時到達,也是依次執(zhí)行,推薦使用(mysql事務在高并發(fā)下性能下降很厲害,文件鎖的方式也是)

先將商品庫存如隊列

 

<?php$store=1000;$redis=new Redis();$result=$redis->connect('127.0.0.1',6379);$res=$redis->llen('goods_store');echo $res;$count=$store-$res;for($i=0;$i<$count;$i++){	$redis->lpush('goods_store',1);}echo $redis->llen('goods_store');?>

搶購、描述邏輯

<?php$conn=mysql_connect("localhost","big","123456"); if(!$conn){ 	echo "connect failed"; 	exit; } mysql_select_db("big",$conn); mysql_query("set names utf8");$price=10;$user_id=1;$goods_id=1;$sku_id=11;$number=1;//生成唯一訂單號function build_order_no(){  return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);}//記錄日志function insertLog($event,$type=0){	global $conn;	$sql="insert into ih_log(event,type) 	values('$event','$type')"; 	mysql_query($sql,$conn); }//模擬下單操作//下單前判斷redis隊列庫存量$redis=new Redis();$result=$redis->connect('127.0.0.1',6379);$count=$redis->lpop('goods_store');if(!$count){	insertLog('error:no store redis');	return;}//生成訂單 $order_sn=build_order_no();$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; $order_rs=mysql_query($sql,$conn); //庫存減少$sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";$store_rs=mysql_query($sql,$conn); if(mysql_affected_rows()){ 	insertLog('庫存減少成功');}else{ 	insertLog('庫存減少失敗');} 

模擬5000高并發(fā)測試

webbench -c 5000 -t 60 http://192.168.1.198/big/index.php
ab -r -n 6000 -c 5000  http://192.168.1.198/big/index.php

上述只是簡單模擬高并發(fā)下的搶購,真實場景要比這復雜很多,很多注意的地方

如搶購頁面做成靜態(tài)的,通過ajax調用接口

再如上面的會導致一個用戶搶多個,思路:

需要一個排隊隊列和搶購結果隊列及庫存隊列。高并發(fā)情況,先將用戶進入排隊隊列,用一個線程循環(huán)處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減1,寫數據庫,將用戶入結果隊列。

測試數據表

---- 數據庫: `big`---- ------------------------------------------------------------ 表的結構 `ih_goods`--CREATE TABLE IF NOT EXISTS `ih_goods` (  `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `cat_id` int(11) NOT NULL,  `goods_name` varchar(255) NOT NULL,  PRIMARY KEY (`goods_id`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;---- 轉存表中的數據 `ih_goods`--INSERT INTO `ih_goods` (`goods_id`, `cat_id`, `goods_name`) VALUES(1, 0, '小米手機');-- ------------------------------------------------------------ 表的結構 `ih_log`--CREATE TABLE IF NOT EXISTS `ih_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `event` varchar(255) NOT NULL, `type` tinyint(4) NOT NULL DEFAULT '0', `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;---- 轉存表中的數據 `ih_log`---- ------------------------------------------------------------ 表的結構 `ih_order`--CREATE TABLE IF NOT EXISTS `ih_order` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_sn` char(32) NOT NULL, `user_id` int(11) NOT NULL, `status` int(11) NOT NULL DEFAULT '0', `goods_id` int(11) NOT NULL DEFAULT '0', `sku_id` int(11) NOT NULL DEFAULT '0', `price` float NOT NULL, `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='訂單表' AUTO_INCREMENT=1 ;---- 轉存表中的數據 `ih_order`---- ------------------------------------------------------------ 表的結構 `ih_store`--CREATE TABLE IF NOT EXISTS `ih_store` ( `id` int(11) NOT NULL AUTO_INCREMENT, `goods_id` int(11) NOT NULL, `sku_id` int(10) unsigned NOT NULL DEFAULT '0', `number` int(10) NOT NULL DEFAULT '0', `freez` int(11) NOT NULL DEFAULT '0' COMMENT '虛擬庫存', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='庫存' AUTO_INCREMENT=2 ;---- 轉存表中的數據 `ih_store`--INSERT INTO `ih_store` (`id`, `goods_id`, `sku_id`, `number`, `freez`) VALUES(1, 1, 11, 500, 0);

以上就是小編為大家?guī)淼膒hp結合redis實現高并發(fā)下的搶購、秒殺功能的實例全部內容了,希望大家多多支持武林網~

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
日韩欧中文字幕| 69av亚洲| 欧美日韩中文字幕综合视频| 免费在线国产| 中文亚洲欧美| 国产农村妇女精品一二区| 精品国产综合久久| 日韩一级视频在线观看| av免费在线不卡| 欧美日韩国产成人| 色猫猫国产区一区二在线视频| 国产日产一区二区三区| 在线观看免费国产小视频| 午夜成人鲁丝片午夜精品| 91精品国产综合久久福利 | 亚洲成av人片一区二区密柚| 一级国产黄色片| 国产婷婷一区二区| 日韩字幕在线观看| 九九视频精品免费| 日韩视频一区二区在线观看| 亚洲一区在线观看视频| 国产欧美综合在线| 国产一级网站视频在线| 欧美日韩综合在线| 中文字幕精品在线视频| 国产高清精品二区| 久久视频一区| 中文字幕亚洲国产| 免费视频久久| 久久99精品久久久| 欧美日韩精品综合在线 | 免费精品国产自产拍观看| 91久久久精品| 欧美国产一级片| 日韩黄色在线播放| 国产极品嫩模在线视频一区 | 欧美不卡一区二区| 免费中文字幕日韩欧美| 国产久卡久卡久卡久卡视频精品| 日本а中文在线天堂| 精品一二线国产| 最近免费中文字幕在线第一页| 久久综合九色欧美综合狠狠| 中文字幕亚洲在| 国产乱国产乱300精品| 日韩欧美999| 国产天堂素人系列在线视频| 在线视频三区| 一二三区精品视频| 午夜一区二区三区免费| 国产日韩中文在线| 天堂在线中文资源| 亚洲免费在线视频一区 二区| 日韩欧美在线网站| 日韩精品在线看| 91精品国产高清久久久久久| 日韩高清在线一区二区| 日韩欧美在线影院| 亚洲天堂国产视频| 精品播放一区二区| 国产欧美 在线欧美| 久久激情中文| 日韩精品视频网| 中文字幕日韩免费视频| 国产欧美日韩中文久久| 久久精品www| 国产日韩精品在线看| 国产黄色高清在线| 中文字幕无线码一区| 91九色在线播放| 婷婷中文字幕一区三区| 二区视频在线观看| 在线精品视频免费播放| aa国产成人| 久久久久蜜桃| 亚洲一区中文字幕在线| 快she精品国产999| 日韩欧美亚洲视频| wwww亚洲| 日韩视频精品在线| 亚洲伊人婷婷| 免费高清特黄a大片| 国产在线欧美| 亚洲欧美韩国综合色| 日韩欧美三级视频| 被陌生人带去卫生间啪到腿软| 久久99久久久久久久噜噜| 成人精品国产福利| 亚洲成av人片在线| 色综合天天综合网天天狠天天| 日韩精品在线网站| 中文欧美日韩| 午夜伦欧美伦电影理论片| 日韩不卡一区二区| 国产色综合网| 色一区在线观看| 91精品无人成人www| wwwwww在线观看| 亚洲免费观看视频| 日韩黄色在线播放| 综合激情一区| 国产午夜精品久久| 日韩亚洲欧美中文在线| 日韩高清不卡| 亚洲一区精品电影| 日韩欧美在线视频日韩欧美在线视频 | 欧美日韩亚洲国内综合网俺| 不卡福利视频| 欧美久久久精品| 欧美人妻一区二区三区| 亚洲成av人综合在线观看| 国产欧美自拍一区| 亚洲最新永久观看在线| 久久精品欧美日韩精品| 欧美日韩在线综合| 国产黄色片中文字幕| 欧美日韩三级在线观看| 91精品免费在线观看| 高清不卡一区二区| 日韩不卡在线观看| www.久久草| 国产999在线观看| 尤物av一区二区| h片精品在线观看| 久久精品日韩欧美| 欧美日韩国产在线播放| 中文在线а√在线8| 国产欧美亚洲一区| 日韩久久精品视频| 蜜桃久久av| 欧美日韩国产高清视频| 欧美中文字幕视频| 国产区在线看| 中文字幕日韩精品在线| 九九在线精品| 精品av中文字幕在线毛片| 欧美日韩国产免费观看视频| 国产一卡二卡3卡4卡四卡在线| 91亚洲国产高清| 欧洲精品在线视频| 国产欧美日韩在线| 日韩在线三区| 国产成人日日夜夜| 久久香蕉精品| 91最新在线| 精品综合久久久久| 国产亚洲短视频| 国产成人精品免费久久久久| 精品国产网站在线观看| 亚洲黄在线观看| 欧美日韩视频网站| 福利一区二区| 一级网站免费观看| 日韩高清不卡| 欧美亚洲专区| 久久久精品免费免费| 欧美日韩在线不卡| 国产视频一区二| 精品日韩在线| 欧美日韩视频免费看| 天天摸日日摸狠狠添| 91精品国产高清| 欧美日韩精品在线播放| 国产xxx在线| 欧美日韩高清在线一区| 中文字幕第一页在线播放| 欧美一级手机免费观看片 | 日韩欧美中文字幕公布| 欧美日韩国产999| 精品国自产在线观看| 日韩欧美中文在线| 国产日韩综合| 中文字幕精品一区二| 国产日产一区二区三区 | 日韩中文字幕亚洲| 国产91欧美| 欧美高清视频一区二区三区| 久草亚洲一区| 日韩在线观看精品| 国产黄色高清在线| 日韩欧美国产免费| 国产视频一区三区| 一区二区不卡久久精品| 日韩欧美视频一区二区三区四区| 蜜桃久久av一区| 一区二区三区精品久久久| aaa欧美日韩| 久久激情中文| 国产视频一区三区| 激情久久99| 亚洲免费中文字幕| 精品成a人在线观看| 国产一区成人| 中文字幕第一页在线| 91精品国产综合久久久蜜臀粉嫩| 欧美久久一二三四区| 亚洲综合在线中文字幕| 欧美三级网址| 日本黄色一区二区三区| 国产精品福利视频一区二区三区| 欧美日韩久久不卡| 亚洲高清免费一级二级三级| 精品免费久久久| 欧美午夜精品在线| 一级特黄大欧美久久久| 红桃视频亚洲| 国产中文在线视频| 日韩精品一二三四区| 国产在线观看黄色| 日韩欧美亚洲国产| 亚洲精华国产欧美| 日韩在线中文字幕| 国产区日韩欧美| 精品久久九九| 精品国产不卡一区二区| 国产劲爆久久| 精品九九久久| 日韩中文在线视频| 日韩免费电影网站| 欧美日韩精品国产| av中文资源在线| 日韩中文字幕91| 国产偷国产偷亚洲清高网站| 久久精品一级爱片| 一区二区视频免费看| 精品中文字幕在线| 伊人精品视频| 国产黄色高清在线| 亚洲人成欧美中文字幕| 日韩精品视频免费播放| 国产亚洲视频中文字幕视频| 亚洲 欧美 日韩系列| 亚洲成av人片在线| 精品一区二区三区中文字幕 | 欧美1234区| 欧美三级日韩在线| 亚洲午夜av| 国产日韩亚洲欧美| 日韩欧美亚洲日产国| 日韩欧美色综合| 欧美在线日韩在线| 欧美中日韩在线| 亚洲日本精品视频| 中文字幕在线欧美| 二区中文字幕| 亚州福利视频| 欧美日韩精品国产| 99精品在线播放| 日韩不卡av| 国产免费不卡av| 一级网站免费观看| 精品国产99久久久久久| 视频一区中文字幕国产| xxxxx性| 国产高潮久久久| 中文字幕在线视频精品| 一区二区三区高清在线| 日韩午夜黄色| 日本精品国语自产拍在线观看| 人成免费在线视频| 国产123在线| 欧美日韩综合高清一区二区 | 欧美中文字幕在线视频| 国产在成人精品线拍偷自揄拍| 国产第一页在线播放| 久久久综合av| 国产丝袜一区| 中文字幕亚洲乱码| 欧美日韩亚洲不卡| 丰满少妇一区二区| 国产美女主播视频一区| 日韩三级视频在线| 欧美日韩亚洲系列| 中文字幕一区不卡| 欧美日韩高清| 国产乱国产乱300精品| h片精品在线观看| lutube成人福利在线观看| 中文字幕综合在线| 91精品国产91久久久久久不卡 | 国产黄色在线看| 欧美国产日韩综合| 精品在线一区二区| 中文字幕日韩亚洲| 黄色片免费看| 国产精久久久久| 欧美日韩视频在线| 日韩中文字幕| 欧美国产中文| 国产在线黄色| 国产在线小视频| 91精品国产综合久久久久| 二区三区中文字幕| 国产偷久久久精品专区| 国产拍揄自揄精品视频麻豆| 精品免费久久久| 亚洲免费福利视频| 日韩区欧美区| 深夜福利一区| 中文在线视频观看| 欧美一卡2卡3卡4卡| 日韩色在线观看| aa国产成人| 精品乱子伦一区二区| 久久99精品久久久久婷婷| 国产999精品在线观看| 精品欧美不卡一区二区在线观看| 日韩视频在线观看视频| 亚洲成人7777| 国产欧美日韩中文久久| 在线不卡日本| 欧美日韩激情一区二区三区| 日韩一级在线免费观看| 色猫猫国产区一区二在线视频| 一区二区三区免费看视频| 中文天堂在线一区| 国产v日产∨综合v精品视频| 亚洲国产无线乱码在线观看| 91精品国产色综合久久不卡蜜臀| 国产午夜精品久久| 国产在成人精品线拍偷自揄拍| 欧美二区在线观看| 日韩欧美亚洲视频| 中文亚洲免费| 欧美日韩高清一区二区不卡| 国产区日韩欧美| 欧美日韩亚洲91| www.狠狠干| 日韩精品视频中文在线观看| 亚洲社区在线| 欧美自拍一区| 视频在线一区二区| 黄色在线资源| 一区免费在线| 日韩欧美亚洲日产国| 欧美日韩国产123区| 日韩欧美一级视频| 国产一区精品| 免费国产成人看片在线| 亚洲福利一区| 中文字幕在线观看网址| 亚洲人成欧美中文字幕| 国产网站av| 日韩欧美亚洲区| 日韩在线视频精品| 日本国产在线视频| www中文字幕| 在线观看免费国产成人软件| 欧美日韩国产在线| 成人一区二区不卡免费| 色欧美日韩亚洲| 99pao成人国产永久免费视频| 日韩av一区二| 日韩综合精品| 亚洲素人一区二区| 成人久久在线| 精品1区2区3区| 最近高清中文在线字幕在线观看| 久久蜜桃一区二区| 色综合影院在线| 亚洲а∨精品天堂在线| 国产成人精品免费网站| 欧美日韩视频免费看| 日韩精品手机在线| 91精品国产综合久久久久| 中文字幕99| 亚洲欧洲综合另类| av免费看在线| 二区中文字幕| 欧美日韩国产在线播放| 亚洲第一香蕉网| 久久99精品久久久久婷婷| 亚洲人成欧美中文字幕| 日韩欧美三级在线| 日韩精品在线观看视频| 亚洲国产综合久久| 日韩国产一区三区| 一区二区三区在线不卡| 午夜一区二区三区| www在线视频| 欧美一级欧美三级在线观看| 国内激情久久| 亚洲一区日韩精品中文字幕| 国产欧美日韩中文| 亚洲视频色图| 91精品免费在线观看| 热久久精品国产| 国产欧美久久久精品免费| 日韩欧美视频一区二区三区四区| 日韩久久精品视频| 中文字幕精品亚洲| 日韩精品在线观看视频| 欧美日韩激情在线一区二区三区| 一区在线播放视频| 日韩久久久精品| 国产v日产∨综合v精品视频| 国产999在线观看| 免费精品国产自产拍观看| 免费视频二区|