1.Redis 管道命令被使用的原因
首先redis是一种基于 客户端-服务端 以及请求/响应协议服务。因此无论是发出请求还是接收响应,都必须经过网络,即客户端必须接收到服务端完整的响应后才能进行后续操作。网络传输不可避免的会造成一定的延迟。一条命令对应一次请求和响应的话,大量命令累计的延迟会显得很高。所以在不需要返回值的情况下推荐使用管道命令操作,大量减少网络传输。
2.使用管道命令和不使用管道命令的区别在哪
在大量连续操作Redis时,每一条Redis命令都将触发一次请求/响应,
比如:不适用管道
foreach($aIdArr as $ikey => $iWid){
if( !is_numeric($iWid)){
print "error" . $iWid;
continue;
}
$redis->HINCRBY($aTable[$sListTable], $iWid, 1);
}
命令很简单只是对应的数据累加1,但是数组长度就是出现网络请求和响应的次数
但是使用管道命令就不一样了 它类似与把这些累加命令打包 并一次传输到服务端执行
使用管道
$redisPipe = $redis->multi(Redis::PIPELINE);
foreach($aIdArr as $ikey => $iWid){
if( !is_numeric($iWid)){
print "error" . $iWid;
continue;
}
$redisPipe->HINCRBY($aTable[$sListTable], $iWid, 1);
}
$redisPipe->exec();
multi(Redis::PIPELINE)创建管道命令
往管道中添加命令
exec()发送请求执行管道中的命令
3.管道命令的返回值是什么格式的
是数组形式的,推荐试一下
例子:这里得到的返回值就是上面例子循环的数组
$redisPipe = $redis->multi(Redis::PIPELINE);
for($ii=0;$ii<$cnt;$ii++){
$redisPipe->rpop($sListTable . '_Hit');
}
$aIdArr = $redisPipe->exec();
但是好像管道不能重复使用 exec()后需要重新创建
4.使用管道需要注意的事项
使用 pipeline 组装的命令个数不要太多,
否则数据量过大,增加客户端的等待执行时间,还有可能造成网络阻塞,
可以适当地将大量命令的拆分成多个小的 pipeline 命令完成