php redis pipeline管道技術

概念

如果需要一次執行多個redis命令,以往的方式需要發送多次命令請求,有redis服務器依次執行,並返回結果,爲了解決此類問題,設計者設計出了redis管道命令:客戶端可以向服務器發送多個請求,而不必等待回覆,並最終在一個步驟中讀取回復,從而大大增加了協議性能

代碼示例
1 、不使用管道技術

$stime=microtime(true); //獲取程序開始執行的時間
echo '開始內存:'.memory_get_usage(), ''; echo PHP_EOL;
$redis = new \Redis();

$redis->connect('127.0.0.1',6379);



$t1 = time();
for($i= 0; $i<10000 ; $i++) {

    $redis->set("key::$i",str_pad($i,4,'0',0));

    $redis->get("key::$i");

}


$etime=microtime(true);//獲取程序執行結束的時間

$total=($etime-$stime);   //計算差值


echo "[頁面執行時間:{$total} ]s"; echo PHP_EOL;
echo '運行後內存:'.memory_get_usage(), ''; echo PHP_EOL;
[root@localhost PHPCreeper-Application]# php test.php
開始內存:389984
[頁面執行時間:1.1715140342712 s
運行後內存:398912

2 、使用管道技術

<?php
$stime=microtime(true); //獲取程序開始執行的時間
echo '開始內存:'.memory_get_usage(), ''; echo PHP_EOL;
$redis = new \Redis();

$redis->connect('127.0.0.1',6379);


$pipe=$redis->multi($redis::PIPELINE);

for($i= 0; $i<10000 ; $i++) {

    $pipe->set("key::$i",str_pad($i,4,'0',0));

    $pipe->get("key::$i");

}

$replies=$pipe->exec();

$etime=microtime(true);//獲取程序執行結束的時間

$total=($etime-$stime);   //計算差值


echo "[頁面執行時間:{$total} ]s"; echo PHP_EOL;
echo '運行後內存:'.memory_get_usage(), ''; echo PHP_EOL;

[root@localhost PHPCreeper-Application]# php test.php
開始內存:390024
[頁面執行時間:0.017589092254639 ]s
運行後內存:1771680

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

不使用管道

開始內存:389984
[頁面執行時間:1.1715140342712 s
運行後內存:398912

使用管道
開始內存:390024
[頁面執行時間:0.017589092254639 ]s
運行後內存:1771680

可以看到使用管道提高了將近100倍。但是缺點也很明顯內存飆升的很厲害。沒有任何原子性的保證。批量執行命令,不能無限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章