亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php和redis實現秒殺活動的流程

2024-05-05 00:10:22
字體:
來源:轉載
供稿:網友

1 說明

前段時間面試的時候,一直被問到如何設計一個秒殺活動,但是無奈沒有此方面的實際經驗,所以只好憑著自己的理解和一些資料去設計這么一個程序

主要利用到了redis的string和set,string主要是利用它的k-v結構去對庫存進行處理,也可以用list的數據結構來處理商品的庫存,set則用來確保用戶進行重復的提交

其中我們最主要解決的問題是

-防止并發產生超搶/超賣

2 流程設計

php,redis,秒殺活動

3 代碼

3.1 服務端代碼

class MiaoSha{ const MSG_REPEAT_USER = '請勿重復參與'; const MSG_EMPTY_STOCK = '庫存不足'; const MSG_KEY_NOT_EXIST = 'key不存在'; const IP_POOL = 'ip_pool'; const USER_POOL = 'user_pool'; /** @var Redis */ public $redis; public $key; public function __construct($key = '') {  $this->checkKey($key);  $this->redis = new Redis(); //todo 連接池  $this->redis->connect('127.0.0.1'); } public function checkKey($key = '') {  if(!$key) {   throw new Exception(self::MSG_KEY_NOT_EXIST);  } else {   $this->key = $key;  } } public function setStock($value = 0) {  if($this->redis->exists($this->key) == 0) {   $this->redis->set($this->key,$value);  } } public function checkIp($ip = 0) {  $sKey = $this->key . self::IP_POOL;  if(!$ip || $this->redis->sIsMember($sKey,$ip)) {   throw new Exception(self::MSG_REPEAT_USER);  } } public function checkUser($user = 0) {  $sKey = $this->key . self::USER_POOL;  if(!$user || $this->redis->sIsMember($sKey,$user)) {   throw new Exception(self::MSG_REPEAT_USER);  } } public function checkStock($user = 0, $ip = 0) {  $num = $this->redis->decr($this->key);  if($num < 0 ) {   throw new Exception(self::MSG_EMPTY_STOCK);  } else {   $this->redis->sAdd($this->key . self::USER_POOL, $user);   $this->redis->sAdd($this->key . self::IP_POOL, $ip);   //todo add to mysql   echo 'success' . PHP_EOL;   error_log('success' . $user . PHP_EOL,3,'/var/www/html/demo/log/debug.log');  } } /**  * @note:此種做法不能防止并發  * @func checkStockFail  * @param int $user  * @param int $ip  * @throws Exception  */ public function checkStockFail($user = 0,$ip = 0) {  $num = $this->redis->get($this->key);  if($num > 0 ){   $this->redis->sAdd($this->key . self::USER_POOL, $user);   $this->redis->sAdd($this->key . self::IP_POOL, $ip);   //todo add to mysql   echo 'success' . PHP_EOL;   error_log('success' . $user . PHP_EOL,3,'/var/www/html/demo/log/debug.log');   $num--;   $this->redis->set($this->key,$num);  } else {   throw new Exception(self::MSG_EMPTY_STOCK);  } }}

 

3.2 客戶端測試代碼

function test(){ try{  $key = 'cup_';  $handler = new MiaoSha($key);  $handler->setStock(10);  $user = rand(1,10000);  $ip = $user;  $handler->checkIp($ip);  $handler->checkUser($user);  $handler->checkStock($user,$ip); } catch (/Exception $e) {  echo $e->getMessage() . PHP_EOL;  error_log('fail' . $e->getMessage() .PHP_EOL,3,'/var/www/html/demo/log/debug.log'); }}function test2(){ try{  $key = 'cup_';  $handler = new MiaoSha($key);  $handler->setStock(10);  $user = rand(1,10000);  $ip = $user;  $handler->checkIp($ip);  $handler->checkUser($user);  $handler->checkStockFail($user,$ip); //不能防止并發的 } catch (/Exception $e) {  echo $e->getMessage() . PHP_EOL;  error_log('fail' . $e->getMessage() .PHP_EOL,3,'/var/www/html/demo/log/debug.log'); }}

 

4 測試

測試環境說明

  • ubantu16.04
  • redis2.8.4
  • php5.5

在服務端代碼里面我們有兩個函數分別是checkStock和checkStockFail,其中checkStockFail不能在高并發的情況下效果很差,不能在redis層面保證庫存為0的時候終止操作。

我們利用ab工具進行測試

其中 www.hello.com 是配置的虛擬主機名稱 flash-sale.php 是我們腳本的名稱

#第1種情況 500并發下 用客戶端的test2()去執行 ab -n 500 -c 100 www.hello.com/flash-sale.php

 

log日志的記錄結果:

php,redis,秒殺活動

#第2種情況 5000并發下 用客戶端的test2()去執行 ab -n 5000 -c 1000 www.hello.com/flash-sale.php

 

log日志的記錄結果:

php,redis,秒殺活動

#第3種情況 500并發下 用客戶端的test()去執行 ab -n 500 -c 100 www.hello.com/flash-sale.php

log日志的記錄結果:

php,redis,秒殺活動

#第4種情況 5000并發下 用客戶端的test()去執行 ab -n 5000 -c 1000 www.hello.com/flash-sale.php

 

log日志的記錄結果:

php,redis,秒殺活動

5 總結

我們從日志中可以很明顯的看出第3、4中情況下,可以保證商品的數量總是我們設置的庫存值10,但是在情況1、2下,則產生了超賣的現象

redis來控制并發主要是利用了其api都是原子性操作的優勢,從checkStock和checkStockFail中可以看出,一個是直接decr對庫存進行減一操作,所以不存在并發的情況,但是另一個方法是將庫存值先取出做減一操作然后再重新賦值,這樣的話,在并發下,多個進程會讀取到多個庫存為1的值,因此會產生超賣的情況

以上所述是小編給大家介紹的php和redis實現秒殺活動的流程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷综合成人av| 91精品久久久久久久久中文字幕| 疯狂做受xxxx高潮欧美日本| 亚洲最大的免费| 国产精品极品美女粉嫩高清在线| 久久久久久亚洲精品| 91精品视频免费| 欧美日韩中国免费专区在线看| 日韩中文字幕国产精品| 日韩a**中文字幕| 国产精品日韩一区| 国产亚洲精品激情久久| 国产精品精品一区二区三区午夜版| 久久这里只有精品99| 精品香蕉一区二区三区| 久久99国产综合精品女同| 亚洲午夜激情免费视频| 亚洲激情久久久| 国产午夜精品免费一区二区三区| 精品视频—区二区三区免费| 在线成人中文字幕| 亚洲少妇激情视频| 中文国产成人精品| 国产成+人+综合+亚洲欧洲| 日本国产高清不卡| 国产精品入口尤物| 精品亚洲一区二区| 91精品国产91久久久久久不卡| 最近的2019中文字幕免费一页| 国产区亚洲区欧美区| 日本视频久久久| 国产精品午夜视频| 国产精品福利无圣光在线一区| 精品一区二区三区四区在线| 久久免费在线观看| 久久亚洲私人国产精品va| 精品久久久久久久久久久久久久| 91免费看国产| 国产精品久在线观看| yw.139尤物在线精品视频| 成人精品视频久久久久| 97超碰国产精品女人人人爽| 黑丝美女久久久| 国内精久久久久久久久久人| 国产日韩中文字幕在线| 日韩欧美亚洲范冰冰与中字| 久久久久久国产精品| 亚洲精品在线视频| 亚洲成人黄色在线观看| 国产精品午夜一区二区欲梦| 97视频网站入口| 中文字幕亚洲欧美日韩高清| 亚洲老板91色精品久久| 精品国产一区二区三区久久久狼| 国产精品美女主播在线观看纯欲| 久久久久久久久久婷婷| 精品国产区一区二区三区在线观看| 欧美成人免费大片| 国产欧美久久久久久| 欧美黄网免费在线观看| 欧美性猛交xxxx久久久| www.亚洲男人天堂| 国产亚洲精品久久久久久777| 亚洲热线99精品视频| 国产成人精品电影久久久| 97色在线观看免费视频| 色噜噜亚洲精品中文字幕| 国产精品久久久久久久7电影| 大胆人体色综合| 欧美国产日韩xxxxx| 亚洲偷熟乱区亚洲香蕉av| 久久九九全国免费精品观看| 久久精品免费播放| 亚洲第一精品夜夜躁人人爽| 欧美日韩国产一中文字不卡| 国产一区二区三区在线播放免费观看| 91免费综合在线| 在线亚洲午夜片av大片| 亚洲爱爱爱爱爱| 欧美性猛交xxxx久久久| 色偷偷偷综合中文字幕;dd| 久久人体大胆视频| 国产成人福利视频| 欧美一级大片视频| 91精品国产色综合久久不卡98| 亚洲精品国产精品久久清纯直播| 亚洲国产成人在线播放| 久久久久久久久久国产精品| 欧美在线亚洲在线| 国产精品专区第二| 日本久久久a级免费| 久操成人在线视频| 97国产精品久久| 久久国产色av| 亚洲激情视频网站| 国产精品国内视频| 欧美激情在线视频二区| 麻豆一区二区在线观看| 欧美成人合集magnet| 国产精品久久久久久久久久| 久久97精品久久久久久久不卡| 国产精品久久综合av爱欲tv| 国产成人精品在线观看| 久久精品久久久久久国产 免费| 韩剧1988在线观看免费完整版| 97超碰国产精品女人人人爽| 欧美激情视频一区二区| 日韩欧美视频一区二区三区| 色av中文字幕一区| 国产视频丨精品|在线观看| 蜜月aⅴ免费一区二区三区| 亚洲视频综合网| 亚洲在线www| 日韩在线播放视频| 久久99久久亚洲国产| 久久成人亚洲精品| 精品国产鲁一鲁一区二区张丽| 69av在线播放| 欧美激情视频三区| 亚洲免费视频在线观看| 国产精品久久久久久久午夜| 亚洲第一天堂无码专区| 91免费国产网站| 亚洲奶大毛多的老太婆| 欧美中文在线视频| 91色视频在线观看| 久久精品国产欧美激情| 亚洲日本欧美中文幕| 欧美性猛xxx| 国产精品入口尤物| 日韩欧美在线中文字幕| 久久伊人精品天天| 久久久久久美女| 国产精品一区av| 中文字幕av一区二区三区谷原希美| 日韩av有码在线| 91最新国产视频| 亚洲欧美中文在线视频| 4444欧美成人kkkk| 国产原创欧美精品| 亚洲精品99999| 日韩av免费一区| 精品人伦一区二区三区蜜桃网站| 日韩免费中文字幕| 亚洲视频欧美视频| 91av在线国产| 国产欧美精品久久久| 精品久久久久久国产91| 亚洲女成人图区| 欧美精品在线极品| 日韩美女主播视频| 日韩成人激情在线| 这里只有精品在线观看| 一色桃子一区二区| 国产亚洲精品美女久久久| 日韩国产精品视频| 欧美俄罗斯性视频| 伊人伊成久久人综合网小说| 日韩中文字幕视频在线| 狠狠久久五月精品中文字幕| 欧美日韩国产一区中文午夜| 亚洲欧美另类中文字幕| 国产精品成人一区| 欧美中文字幕在线播放|