predis VS phpRedis

3964 ワード

predisとphpRedisはphp接続redisで最もよく使われる2つのパケットである.作業項目では、redisに非常に依存するため、predisとphpRedisの両方のパフォーマンスの違いを比較します.
前に書く
  • テストに使用するコードアドレス-github
  • 試験環境1.redis: Redis server v=2.9.11 2.php: PHP 7.1.29(cli)(PHPRedis拡張をインストールする必要がある)3.機械情報:Mac i 5 8 Gメモリ
  • スタンドアロンテスト
    それぞれ5 W回のredis書き込みコマンドを順番に実行し,それらの時間(ms)を比較した.一定の差はあるが,差は大きくない.
    回数
    predis
    phpRedis
    5w
    3000
    2999
    5w
    3000
    3000
    10w
    6000
    6000
    10w
    5001
    5999
    50w
    34999
    33001
    50w
    32000
    28999
    同時テスト
    APIを書き、一定量keyを読み書きし、時間を統計する.ab同時テストを用いて,両者の違いを比較した.
    合計回数
    コンカレント数
    読み書き数
    predis
    phpRedis
    コメント
    1000
    100
    2000
    333968
    309012
    redis変カード、大量の待ち時間があるかもしれません
    5000
    100
    200
    203008
    201993
    redis変カード、大量の待ち時間があるかもしれません
    5000
    50
    200
    234967
    177043
    格差が広がる
    5000
    100
    20
    25002
    14007
    格差は拡大し続け、phpredisが接続を確立するのが速い可能性があると推測されている.
    5000
    100
    20
    20996
    13003
    同上
    5000
    100
    2
    7000
    4999
    5000
    100
    2
    10002
    4999
    5000
    100
    1
    10996
    2001
    基本的な決定は、接続の確立にかかる時間の差です.
    5000
    100
    1
    7999
    2001
    //         
    $t = rand(0,1);
    if ($t == 0) {
        $this->testRedis(new phpRedisConn());
    }else{
        $this->testRedis(new PredisConn());
    }
    //     
        private function testRedis(conn $conn)
        {
            $mode = $conn->getMode();
    
            $startTime = Comm::getMillisecond();
            Comm::PrintEcho("string     ..." . "    :" . $startTime . "      :" . $mode);
    
            for ($i = 0; $i < self::NUM; $i++)
            {
                $conn->set($conn->getMode(), $i);
            }
    
            $endTime = Comm::getMillisecond();
    
            $useTime = $endTime - $startTime;
    
            $conn->incrby("useTime_" . $mode, $useTime);
    
            Comm::PrintEcho("string     ..." . "    :" . $useTime . "      :" . $mode);
        }
    

    多重接続
    phpRedisはpredisよりもう一つ、phpredisがpconnect()を実現した点です.pconnectはredisが終了した後、空きタイムアウトが自動的に切断されるまでredis接続を破棄しません.pconnectはphp-fpmプロセスに依存し,プロセスが死なないとconnectが存在する.
    /*
    * $host redis IP $port redis   
    * $timeout     (      redis    )
    * $persistent_id                
    */
    public function pconnect( $host, $port = 6379, $timeout = 0.0, $persistent_id = null )
    
            //         
            $t = rand(0,2);
            if ($t == 0) {
                $this->testRedis(new phpRedisConn());
            }elseif ($t == 1)
            {
                $this->testRedis(new PredisConn());
            }elseif ($t == 2)
            {
                $this->testRedis(new phpRedisPconn());
            }
    

    合計回数
    コンカレント数
    読み書き数
    predis
    phpRedis
    phpRedisPconn
    コメント
    5000
    100
    200
    70982
    64999
    62002
    上記時間と実行回数が異なるので3つを比較すればよい
    5000
    50
    200
    62985
    42004
    52021
    このシナリオではconnectがより速く~
    5000
    50
    200
    74992
    52001
    54997
    もう一度テストした
    5000
    100
    20
    8997
    7007
    9997
    おかしいな~
    5000
    100
    20
    10999
    7997
    11995
    5000
    100
    2
    5996
    4004
    4996
    5000
    100
    2
    5000
    4998
    2000
    5000
    100
    1
    5000
    4999
    1999
    5000
    100
    1
    4001
    2999
    3997
    5000
    100
    1
    7001
    4996
    2001
    fpm破棄に関連しているかどうかを推測し、同時合計回数を増やします(ミリ秒を計算するたびに小数点数5桁を変更します).
    15000
    100
    1
    11995
    5997
    5007
    差はありますが、差は大きくありません.
    15000
    100
    1
    11995
    8005
    7000
    テストでは、高同時性の場合、pconnectがより効果的になる可能性がありますが、同時性が低い場合はconnectがより速くなります.また,pconnect接続数はfpm数に関連付けられる.
    参考記事:PHPを高くして要求Redis異常処理phpredisのconnectとpconnect史上最もLOWのPHP接続プールソリューション手動でリソースを解放してphp redis pconnectに深く入り込んでください