redis性能提升之pipeline
阿新 • • 發佈:2018-10-04
性能提升 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