PHP+Redis秒殺其實(shí)很簡單

前言:

秒殺這個問題洽洁,一直以來都是經(jīng)典的面試題枫虏。但是秒殺也分大小报强。如果一個產(chǎn)品的用戶不超過5w灸姊,上來就問雙十一級別的秒殺。那就沒有意思了~秉溉,所以今天就簡單聊下一般條件下的秒殺的思路力惯。方法只有兩個,一個是裝載秒殺商品召嘶。一個就是模擬用戶進(jìn)場秒殺父晶。


圖片發(fā)自簡書App

工具介紹

首先環(huán)境就比較簡單

  1. Apache
  2. PHP 7.3
  3. redis

框架我選擇的ThinkPHP5.1 不過這次我主要還是選擇貼近原生的寫法

選擇apache的原因很簡單。自帶壓力測試工具ab弄跌。符合我們的需要甲喝。雖然我們知道nginx來做web服務(wù)器性能更好。
php7.* 這個不用多介紹了PHP 7 和 PHP 5的性能不是一個世界的
redis 雖然可以實(shí)現(xiàn)秒殺的方式有很多铛只。redis算是非常常見的緩存和中間件工具了埠胖。在性能和上手難度上都是很不錯的選擇

一.裝載秒殺商品

我們先假設(shè)我們有300個人來搶30件商品。那么我們就在我們的商品庫里面裝載30件不同id的商品
秒殺商品一般都是定時添加的淳玩。所以我們需要一個定時任務(wù)控制器用cli模式執(zhí)行

class Crontab
{
      public function addGoods()
    {
        //設(shè)定商品數(shù)量
        $count=30;
        $listKey="2019_04_15_goods_list";
        //創(chuàng)建連接redis對象
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        for ($i=1;$i<=$count;$i++){
            //將商品id push到列表中
            $redis->rPush($listKey,$i);
        }
    }
}

然后當(dāng)我們需要裝載商品的時候我們使用php命令去執(zhí)行下我們的方法

php /項(xiàng)目地址/public/index.php index/crontab/addgoods

用redis客戶端查看下商品id是否放入成功


查看商品id

二.秒殺商品

秒殺商品其實(shí)就是一個將集合中的商品id取出和用戶id綁定的過程直撤。只是這個過程進(jìn)行的非常的快。那么我們將秒殺分為兩步蜕着,如果秒殺成功谋竖,則記錄下用戶id和商品id 也就是所謂的秒殺訂單。如果秒殺失敗承匣,我們則簡單的記錄一個秒殺失敗的人數(shù)蓖乘。來確定這次秒殺有多少有效用戶參與。

  public function kill()
    {
        //假裝是用戶的唯一標(biāo)識
        $uuid=md5(uniqid('user').time());
        //創(chuàng)建連接redis對象
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $listKey="2019_04_15_goods_list";
        $orderKey="2019_04_15_buy_order";
        $failUserNum="2019_04_15_fail_user_num";
        if ($goodsId=$redis->lPop($listKey)) {
            //秒殺成功
            //將幸運(yùn)用戶存在集合中
            $redis->hSet($orderKey,$goodsId,$uuid);
        }else{
            //秒殺失敗
            //將失敗用戶計數(shù)
            $redis->incr($failUserNum);
        }
        echo "SUCCESS";
    }

壓力測試模擬秒殺

剛剛有提到會使用apache自帶的ab做測試
小試牛刀 300并發(fā) 3000訪問量

ab -c 300 -n 3000 http://shop.example.com/index.php/index/index/kill

啥也不說就是干

運(yùn)行結(jié)果

雖說還是比較慢韧骗,但是3000次請求嘉抒,是全部命中沒有死掉的用戶。加上我本身docker性能沒給到最大袍暴。加上只有單機(jī)節(jié)點(diǎn)众眨。我對這個成績還是比較滿意的

下面來看看搶到商品的幸運(yùn)用戶

[root@2f7621a62356 bin]# redis-cli  
127.0.0.1:6379> HGETALL 2019_04_15_buy_order
商品和 用戶id的對應(yīng)關(guān)系

再看看秒殺失敗的用戶數(shù)量


搶購失敗次數(shù)

這時候的商品list已經(jīng)空空如也了握牧。

好了,今天簡單做個秒殺娩梨,就介紹到這里。有時候思路比實(shí)現(xiàn)的方法更重要览徒。今天我所介紹的主要是一個思路和redis的用法狈定,現(xiàn)實(shí)中的秒殺肯定還有很多復(fù)雜的邏輯。我也是簡單介紹下习蓬。如果有什么不對的地方歡迎大神指點(diǎn)纽什。感謝

以上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市躲叼,隨后出現(xiàn)的幾起案子芦缰,更是在濱河造成了極大的恐慌,老刑警劉巖枫慷,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件让蕾,死亡現(xiàn)場離奇詭異,居然都是意外死亡或听,警方通過查閱死者的電腦和手機(jī)探孝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉裆,“玉大人顿颅,你說我怎么就攤上這事∽愣” “怎么了粱腻?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斩跌。 經(jīng)常有香客問我绍些,道長,這世上最難降的妖魔是什么滔驶? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任遇革,我火速辦了婚禮,結(jié)果婚禮上揭糕,老公的妹妹穿的比我還像新娘萝快。我一直安慰自己,他們只是感情好著角,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布揪漩。 她就那樣靜靜地躺著,像睡著了一般吏口。 火紅的嫁衣襯著肌膚如雪奄容。 梳的紋絲不亂的頭發(fā)上冰更,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音昂勒,去河邊找鬼蜀细。 笑死,一個胖子當(dāng)著我的面吹牛戈盈,可吹牛的內(nèi)容都是我干的奠衔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塘娶,長吁一口氣:“原來是場噩夢啊……” “哼归斤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刁岸,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤脏里,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虹曙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫横,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年根吁,在試婚紗的時候發(fā)現(xiàn)自己被綠了员淫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡击敌,死狀恐怖介返,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沃斤,我是刑警寧澤圣蝎,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站衡瓶,受9級特大地震影響徘公,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哮针,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一关面、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧十厢,春花似錦等太、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至包颁,卻和暖如春瞻想,著一層夾襖步出監(jiān)牢的瞬間压真,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工蘑险, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滴肿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓漠其,卻偏偏與公主長得像嘴高,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子和屎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容