基於PHP swoole擴展的秒殺思路

基於PHP swoole擴展的秒殺思路

通過ab壓力測試,腳本QPS平均值在4500

ab -n1000 -c10 http://127.0.0.1:9501/skill

腳本代碼,思路基本上也在代碼註釋中說明白了

application-Index.php
/**
     * 經過swoole的chan和協程處理秒殺
     * 思路
     * 設置一個通道channel數量爲1,一個協程向裏面寫入用戶的數據好比是用戶的ID
     * 另外一個協程來處理通道的數據寫入beanstalkd或者Redis中的隊列
     * 此例子我選用寫入Redis的list,由於我本機沒安裝beanstalkd
     */
    public function skill()
    {
        $chan  = new channel(1);
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);

        $res = [];
        //生成者協程
        co::create(function () use ($chan, $redis, &$res) {
            //查看chan中的數量
            $num = $chan->length();
            //當數量等於0而且庫存還有的狀況下的時候表名,通道爲空能夠寫入數據
            // stock庫存須要提早設置到Redis
            if ($num == 0 && $redis->get('stock')) {
                $chan->push(['id' => rand(100, 999)]);
            }
            $res = [0, "搶購失敗"];
        });

        //消費者協程
        co::create(function () use ($chan, $redis, &$res) {
            $data = $chan->pop();
            if ($data) {
                //此處默認每一個人搶購1件,若是須要搶購多件能夠在data中攜帶購買數量
                //並寫入到通道里面
                $redis->set('stock', $redis->get('stock') - 1);
                //寫入Redis list 其餘腳本進行訂單處理之類的IO業務。此處不實現了
                $redis->lPush("skill_swoole", json_encode($data));
                $res = [1, "搶購成功"];
            }
        });

        return Tool::print_json($res[0], $res[1]);

    }

代碼倉庫

https://github.com/SmallForest/Thomas.kj
這是本人本身寫的框架,CLI模式,常駐內存性能高,感興趣的能夠提提建議,幫助一塊兒優化。感謝starphp

秒殺

秒殺實現方式較多,選擇適合本身的最好git

相關文章
相關標籤/搜索