欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > php和redis實現秒殺活動的流程

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

熱門標簽:廣州防封卡外呼系統多少錢一個月 廣東地市地圖標注 哪里辦理400電話 怎么向銷售公司推銷外呼系統 長春人工外呼系統服務商 江西手機自動外呼防封系統是什么 仁和怎么申請400開頭的電話 外呼系統撥打暫時無法接通 高德地圖標注家

1 說明

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

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

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

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

2 流程設計

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日志的記錄結果:

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

log日志的記錄結果:

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

log日志的記錄結果:

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

log日志的記錄結果:

5 總結

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

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

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

您可能感興趣的文章:
  • php結合redis實現高并發下的搶購、秒殺功能的實例
  • Redis瞬時高并發秒殺方案總結
  • php+redis實現商城秒殺功能
  • redis使用watch秒殺搶購實現思路
  • 基于redis分布式鎖實現秒殺功能
  • Redis使用watch完成秒殺搶購功能的代碼
  • Java使用Redis實現秒殺功能
  • 使用Redis實現秒殺功能的簡單方法

標簽:文山 海北 濮陽 黔東 湘西 廈門 梅河口 惠州

巨人網絡通訊聲明:本文標題《php和redis實現秒殺活動的流程》,本文關鍵詞  php,和,redis,實現,秒殺,活動,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《php和redis實現秒殺活動的流程》相關的同類信息!
  • 本頁收集關于php和redis實現秒殺活動的流程的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    极品蜜桃臀肥臀-x88av| 国产免费成人在线视频| 亚洲一区二区三区三| 91香蕉视频污| 亚洲天堂一级片| 日本一区二区高清| 国产精品18久久久久久久久| 亚洲ⅴ国产v天堂a无码二区| 精品国产一区二区精华| 青青草91视频| 女人又爽又黄免费女仆| 久久久久久久久久久久久女国产乱 | 中文字幕色av一区二区三区| 国产成人av在线影院| 中文字幕美女视频| 国产精品久久久久久久久果冻传媒 | 国内外成人在线视频| www.日本高清视频| 国产片一区二区| 高清beeg欧美| 欧美在线影院一区二区| 亚洲制服丝袜av| 久久久久久久无码| 精品久久人人做人人爽| 激情六月婷婷久久| 男人的午夜天堂| 亚洲人成网站色在线观看| 91蜜桃网址入口| 欧美精品三级日韩久久| 免费欧美高清视频| 天堂网av2018| 亚洲免费观看在线观看| 欧美激情 亚洲| 精品久久久久久久久久久久久久久久久| 另类小说欧美激情| 久久久久久久麻豆| 亚洲精品久久嫩草网站秘色| 水蜜桃av无码| 久久久亚洲精华液精华液精华液 | 日韩免费福利电影在线观看| 精品一区二区影视| 99精品久久久久| 亚洲va韩国va欧美va| 亚洲久久久久久久| 中文字幕在线观看一区| 一级黄色大片免费看| 精品日韩欧美一区二区| 高清久久久久久| 欧美卡1卡2卡| 国产一区二区视频在线播放| 色婷婷精品大在线视频| 日韩av一二三| 在线免费看av网站| 亚洲午夜精品一区二区三区他趣| 中文字幕 自拍| 亚洲男人都懂的| 免费在线观看成年人视频| 国产精品色婷婷久久58| 亚洲高清无码久久| 国产欧美日韩卡一| 大尺度在线观看| 欧美激情一区二区三区全黄| 苍井空张开腿实干12次| 久久久夜色精品亚洲| 台湾佬美性中文| 欧美极品少妇xxxxⅹ高跟鞋| 人妻体体内射精一区二区| 久久亚洲捆绑美女| 男人添女人荫蒂国产| 欧美激情自拍偷拍| 视频免费在线观看| 国产精品美女久久久久久2018| 中国一级特黄录像播放| 国产精品久久综合| 成人精品999| 亚洲激情图片qvod| 日本精品久久久久中文| 亚洲高清免费在线| 色综合久久99| 国产在线一区二区综合免费视频| 欧美日韩国产高清一区二区三区 | 一区二区视频免费看| 男女男精品视频| 欧美午夜片在线观看| 国产精品自在在线| 日韩女优电影在线观看| 宇都宫紫苑在线播放| 国产色一区二区| 亚洲av无码成人精品国产| 一区二区三区在线免费视频| 国产一区在线观看免费| 青娱乐精品视频| 欧美日本一区二区在线观看| 粉嫩一区二区三区性色av| 精品国产不卡一区二区三区| 风韵丰满熟妇啪啪区老熟熟女| 国产精品美日韩| 日本欧美一区二区三区不卡视频| 五月婷婷色综合| 欧美视频在线一区二区三区| 成人动漫中文字幕| 久久久精品免费免费| 亚洲第一页av| 五月综合激情婷婷六月色窝| 精品视频在线视频| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美激情中文字幕| 国产精品久久免费观看| 免费成人美女在线观看| 91精品国产免费| 久久精品无码专区| 亚洲激情在线播放| 欧美在线视频你懂得| 99久久伊人久久99| 18欧美亚洲精品| 国产少妇在线观看| 成人性生交大合| 国产精品私人影院| 精品亚洲乱码一区二区| 国产久卡久卡久卡久卡视频精品| 久久综合成人精品亚洲另类欧美| 国精产品一区一区三区免费视频| 丝袜诱惑制服诱惑色一区在线观看 | 欧美日韩在线精品一区二区三区激情| a级高清视频欧美日韩| 国产精品灌醉下药二区| 国产一区第一页| 国产一区二区三区免费播放| 久久久久久久综合狠狠综合| 中文天堂资源在线| 国产精品乡下勾搭老头1| 欧美国产精品劲爆| 欧美另类videoxo高潮| 懂色av一区二区三区免费看| 中文字幕一区二区三区蜜月| 91嫩草|国产丨精品入口| jizzjizzjizz欧美| 一区二区高清免费观看影视大全| 欧美天堂一区二区三区| www.555国产精品免费| 日韩专区一卡二卡| 欧美xingq一区二区| 日本人亚洲人jjzzjjz| 国产精品1024| 亚洲人成精品久久久久久| 色老汉一区二区三区| 杨幂一区二区国产精品| 午夜精品久久久久久不卡8050| 欧美一区二区三区四区高清| 制服 丝袜 综合 日韩 欧美| 国产精品一区久久久久| 中文字幕中文字幕一区二区 | 亚洲午夜一区二区三区| 884aa四虎影成人精品一区| 91视频在线网站| 成人午夜激情片| 亚洲精品视频免费观看| 777久久久精品| 人与嘼交av免费| 成人精品免费看| 亚洲国产婷婷综合在线精品| 日韩三级电影网址| 国产又粗又猛又爽又黄的视频小说 | 精品国产成人亚洲午夜福利| 国产91丝袜在线播放| 一区二区三区四区中文字幕| 日韩一区二区三区观看| 亚洲一级理论片| 少妇性l交大片7724com| 免费日本视频一区| 成人欧美一区二区三区视频网页| 欧美日韩国产中文| 日本一卡二卡在线播放| 爱情岛论坛亚洲自拍| 久热成人在线视频| ㊣最新国产の精品bt伙计久久| 777精品伊人久久久久大香线蕉| 少妇太紧太爽又黄又硬又爽小说| 97se亚洲国产综合自在线不卡| 日韩国产精品久久| 国产精品久久久久久妇女6080| 91麻豆精品国产91久久久久久久久| 成人免费网站黄| av影院午夜一区| 麻豆精品一区二区| 一区二区在线看| 久久久久久久网| 欧美军同video69gay| 国产黄色小视频网站| 黄色av网址在线观看| 成人美女视频在线看| 青青青爽久久午夜综合久久午夜 | 国产主播av在线| 久久久久亚洲AV成人网人人小说| 国产一区二区视频在线| 同产精品九九九| 亚洲人精品午夜| 久久精品视频在线看| 6080yy午夜一二三区久久| 欧美日韩午夜视频|