php redis pipeline管道技术

本文深入探讨了Redis管道技术,展示了如何通过使用管道显著提高Redis命令的执行效率,尤其是在批量执行命令场景下,性能提升可达百倍,但同时指出其可能导致内存使用激增的问题。

概念

如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,有redis服务器依次执行,并返回结果,为了解决此类问题,设计者设计出了redis管道命令:客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复,从而大大增加了协议性能

代码示例
1 、不使用管道技术

$stime=microtime(true); //获取程序开始执行的时间
echo '开始内存:'.memory_get_usage(), ''; echo PHP_EOL;
$redis = new \Redis();

$redis->connect('127.0.0.1',6379);



$t1 = time();
for($i= 0; $i<10000 ; $i++) {

    $redis->set("key::$i",str_pad($i,4,'0',0));

    $redis->get("key::$i");

}


$etime=microtime(true);//获取程序执行结束的时间

$total=($etime-$stime);   //计算差值


echo "[页面执行时间:{$total} ]s"; echo PHP_EOL;
echo '运行后内存:'.memory_get_usage(), ''; echo PHP_EOL;
[root@localhost PHPCreeper-Application]# php test.php
开始内存:389984
[页面执行时间:1.1715140342712 s
运行后内存:398912

2 、使用管道技术

<?php
$stime=microtime(true); //获取程序开始执行的时间
echo '开始内存:'.memory_get_usage(), ''; echo PHP_EOL;
$redis = new \Redis();

$redis->connect('127.0.0.1',6379);


$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();

$etime=microtime(true);//获取程序执行结束的时间

$total=($etime-$stime);   //计算差值


echo "[页面执行时间:{$total} ]s"; echo PHP_EOL;
echo '运行后内存:'.memory_get_usage(), ''; echo PHP_EOL;

[root@localhost PHPCreeper-Application]# php test.php
开始内存:390024
[页面执行时间:0.017589092254639 ]s
运行后内存:1771680

参数说明:
Redis::MULTI或Redis::PIPELINE. 默认是 Redis::MULTI
Redis::MULTI:将多个操作当成一个事务执行
Redis::PIPELINE:让(多条)执行命令简单的,更加快速的发送给服务器,但是没有任何原子性的保证

不使用管道

开始内存:389984
[页面执行时间:1.1715140342712 s
运行后内存:398912

使用管道
开始内存:390024
[页面执行时间:0.017589092254639 ]s
运行后内存:1771680

可以看到使用管道提高了将近100倍。但是缺点也很明显内存飙升的很厉害。没有任何原子性的保证。批量执行命令,不能无限。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值