1. 程式人生 > >redis性能提升之pipeline

redis性能提升之pipeline

性能提升 star 正常 [1] 響應 ini 就是 多條 empty

1、以前正常使用過程

客戶端向服務器發送查詢,並從套接字讀取,通常以阻塞的方式,用於服務器響應。
服務器處理命令並將響應發送回客戶端。
也就是每個命令都會有一來以往的過程

2、管道的意義
如果能將連續執行的redis命令在操作完成後統一返回,就可以減少連接數,從來減少延遲時間,那麽管道也就產生了。
管道的基本含義是,客戶端可以向服務器發送多個請求,而不必等待回復,並最終在一個步驟中讀取回復。

3.參數說明:
Redis::MULTI或Redis::PIPELINE. 默認是 Redis::MULTI
Redis::MULTI:將多個操作當成一個事務執行
Redis::PIPELINE:讓(多條)執行命令簡單的,更加快速的發送給服務器,但是沒有任何原子性的保證

測試代碼1:

<?php
set_time_limit(0);
ini_set(‘memory_limit‘, ‘1024M‘);

$redis = new Redis();

G(‘1‘);
$redis->connect(‘127.0.0.1‘);
//不具備原子性 ,管道
$redis->pipeline();
for ($i = 0; $i < 100000; $i++) {
    $redis->set("test_{$i}", pow($i, 2));
    $redis->get("test_{$i}");
}
$redis->exec();
$redis->close();
G(‘1‘, ‘e‘);

G(‘2‘);
$redis->connect(‘127.0.0.1‘);
//事物具備原子性
$redis->multi();
for ($i = 0; $i < 100000; $i++) {
    $redis->set("test_{$i}", pow($i, 2));
    $redis->get("test_{$i}");
}
$redis->exec();
$redis->close();
G(‘2‘, ‘e‘);

//普通
G(‘3‘);
$redis->connect(‘127.0.0.1‘);
//事物具備原子性
for ($i = 0; $i < 100000; $i++) {
    $redis->set("test_{$i}", pow($i, 2));
    $redis->get("test_{$i}");
}
$redis->close();
G(‘3‘, ‘e‘);

function G($star, $end = ‘‘)
{
    static $info = array();
    if (!empty($end)) {
        $info[$end] = microtime(true);
        $sconds = $info[$end] - $info[$star];
        echo $sconds, "ms" ;
        echo PHP_EOL;
    } else {
        $info[$star] = microtime(true);
    }
}

結果輸出:
0.85941696166992ms 14.938266992569ms 15.121881961823ms

測試代碼2:

<?php
$redis = new Redis();
$redis->connect(‘127.0.0.1‘, 6379);
$pipe = $redis->multi(Redis::PIPELINE);
for ($i = 0; $i < 3; $i++) {
    $key = "key::{$i}";
    print_r($pipe->set($key, str_pad($i, 2, ‘0‘, 0)));
    echo PHP_EOL;
    print_r($pipe->get($key));
    echo PHP_EOL;
}
$result = $pipe->exec();
echo "<pre>";
var_dump($result);

輸出結果:
Redis Object ( ) Redis Object ( ) Redis Object ( ) Redis Object ( ) Redis Object ( ) Redis Object ( )
array(6) {
[0]=>
bool(true)
[1]=>
string(2) "00"
[2]=>
bool(true)
[3]=>
string(2) "01"
[4]=>
bool(true)
[5]=>
string(2) "02"
}

redis性能提升之pipeline