@phper
2016-12-22T04:17:49.000000Z
字数 1611
阅读 9605
redis
redis 中是支持 pipline的,它是管道的概念,也就是多次执行,一次返回。加快了执行的速度。
今天来试一下,如何使用管道
$redis = new Redis();$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();var_dump($replies)
这样就完成了一个管道多次取值。
打印下这个值:
Array([0] => 1[1] => 0000[2] => 1[3] => 0001[4] => 1[5] => 0002[6] => 1[7] => 0003[8] => 1[9] =>......
第一个key是 set 返回的值,1表示成功。第二是get到的值。
看下和传统的对比下执行速度:
$s1 = microtime(true);$redis = Rcache::init();$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();$s2 = microtime(true);echo $s2 - $s1;$s3 = microtime(true); echo PHP_EOL;for ($i=0; $i < 10000 ; $i++) {$redis->set("key1::$i", str_pad($i, 4, '0', 0));$redis->get("key1::$i");}$s4 = microtime(true);echo $s4 - $s3;
打印下时间:
0.14909005165138.773063898087
快了380倍!!! 厉害啊。
其实,mset和mget也可以实现多次复制,多次取值的操作:
for ($i=0; $i < 10000 ; $i++) {$mset["key1::$i"] = str_pad($i, 4, '0', 0);$mget[] = "key1::$i";}$redis->mset($mset);$result = $redis->mget($mget);
也可以达到相同的效果。和 pipline对比下看看?
$s1 = microtime(true);$redis = Rcache::init();$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();$s2 = microtime(true);echo $s2 - $s1;$s3 = microtime(true); echo PHP_EOL;for ($i=0; $i < 10000 ; $i++) {$mset["key1::$i"] = str_pad($i, 4, '0', 0);$mget[] = "key1::$i";}$redis->mset($mset);$result = $redis->mget($mget);$s4 = microtime(true);echo $s4 - $s3;
看下时间对比:
0.127924203872680.0669748783111570.121864080429080.0747208595275880.082654953002930.095463037490845
发现有时候, mget更快。厉害了。
然后,如果for 循环 次数越多,其实,mset和mget更快。
