[关闭]
@phper 2016-12-22T12:17:49.000000Z 字数 1611 阅读 8813

redis 中pipline,mset, mget使用对比

redis


redis 中是支持 pipline的,它是管道的概念,也就是多次执行,一次返回。加快了执行的速度。

今天来试一下,如何使用管道

  1. $redis = new Redis();
  2. $pipe = $redis->multi(Redis::PIPELINE);
  3. for ($i = 0; $i < 10000; $i++) {
  4. $pipe->set("key::$i", str_pad($i, 4, '0', 0));
  5. $pipe->get("key::$i");
  6. }
  7. $replies = $pipe->exec();
  8. var_dump($replies)

这样就完成了一个管道多次取值。

打印下这个值:

  1. Array
  2. (
  3. [0] => 1
  4. [1] => 0000
  5. [2] => 1
  6. [3] => 0001
  7. [4] => 1
  8. [5] => 0002
  9. [6] => 1
  10. [7] => 0003
  11. [8] => 1
  12. [9] =>
  13. ......

第一个key是 set 返回的值,1表示成功。第二是get到的值。

看下和传统的对比下执行速度:

  1. $s1 = microtime(true);
  2. $redis = Rcache::init();
  3. $pipe = $redis->multi(Redis::PIPELINE);
  4. for ($i = 0; $i < 10000; $i++) {
  5. $pipe->set("key::$i", str_pad($i, 4, '0', 0));
  6. $pipe->get("key::$i");
  7. }
  8. $replies = $pipe->exec();
  9. $s2 = microtime(true);
  10. echo $s2 - $s1;
  11. $s3 = microtime(true); echo PHP_EOL;
  12. for ($i=0; $i < 10000 ; $i++) {
  13. $redis->set("key1::$i", str_pad($i, 4, '0', 0));
  14. $redis->get("key1::$i");
  15. }
  16. $s4 = microtime(true);
  17. echo $s4 - $s3;

打印下时间:

  1. 0.149090051651
  2. 38.773063898087

快了380倍!!! 厉害啊。

其实,mset和mget也可以实现多次复制,多次取值的操作:

  1. for ($i=0; $i < 10000 ; $i++) {
  2. $mset["key1::$i"] = str_pad($i, 4, '0', 0);
  3. $mget[] = "key1::$i";
  4. }
  5. $redis->mset($mset);
  6. $result = $redis->mget($mget);

也可以达到相同的效果。和 pipline对比下看看?

  1. $s1 = microtime(true);
  2. $redis = Rcache::init();
  3. $pipe = $redis->multi(Redis::PIPELINE);
  4. for ($i = 0; $i < 10000; $i++) {
  5. $pipe->set("key::$i", str_pad($i, 4, '0', 0));
  6. $pipe->get("key::$i");
  7. }
  8. $replies = $pipe->exec();
  9. $s2 = microtime(true);
  10. echo $s2 - $s1;
  11. $s3 = microtime(true); echo PHP_EOL;
  12. for ($i=0; $i < 10000 ; $i++) {
  13. $mset["key1::$i"] = str_pad($i, 4, '0', 0);
  14. $mget[] = "key1::$i";
  15. }
  16. $redis->mset($mset);
  17. $result = $redis->mget($mget);
  18. $s4 = microtime(true);
  19. echo $s4 - $s3;

看下时间对比:

  1. 0.12792420387268
  2. 0.066974878311157
  3. 0.12186408042908
  4. 0.074720859527588
  5. 0.08265495300293
  6. 0.095463037490845

发现有时候, mget更快。厉害了。

然后,如果for 循环 次数越多,其实,mset和mget更快。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注