使用redis时你是否会遇到这样的问题?

在php开发过程中,你是否会遇到这样问题,在循环当中,去get或者set缓存redis的key,大家知道这样做效率会很低,那我们应该这么做呢?

 

可以使用redis 中pipline,mset, mget,都可以提高我们程序的性能,下面对比一下他们的性能。

 

先看下管道

$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] =>
.  .....

 

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

$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.149090051651
38.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; f

or ($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.12792420387268
0.066974878311157
0.12186408042908
0.074720859527588
0.08265495300293
0.095463037490845

 

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

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

推荐用mset和mget

 

posted @ 2021-03-08 11:46  17601621550  阅读(19)  评论(0)    收藏  举报