您的位置:首页 > 数据库 > Redis

redis 中pipline,mset, mget使用对比

2017-08-15 11:22 369 查看

redis 中pipline,mset, mget使用对比

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.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;

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


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

然后,如果for 循环 次数越多,其实,mset和mget更快。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: