標籤:lin php_eol 基本 原子性 line 管道 set bool print
1、以前正常使用過程
用戶端向伺服器發送查詢,並從通訊端讀取,通常以阻塞的方式,用於伺服器響應。
伺服器處理命令並將響應發送回用戶端。
也就是每個命令都會有一來以往的過程
2、管道的意義
如果能將連續執行的redis命令在操作完成後統一返回,就可以減少串連數,從來減少延遲時間,那麼管道也就產生了。
管道的基本含義是,用戶端可以向伺服器發送多個請求,而不必等待回複,並最終在一個步驟中讀取回複。
3.參數說明:
Redis::MULTI或Redis::PIPELINE. 預設是 Redis::MULTI
Redis::MULTI:將多個操作當成一個事務執行
Redis::PIPELINE:讓(多條)執行命令簡單的,更加快速的發送給伺服器,但是沒有任何原子性的保證
測試代碼1:
<?phpset_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