redis执行一条命令有四个过程:发送命令、命令排队、命令执行、返回结果;整个过程是一个往返时间(RTT)。如果有n条命令,就会消耗n次RTT。Redis的客户端和服务端可能部署在不同的机器上。在两地的数据传输受网络速度的影响,消耗n次的RTT会增加网络成本,这个和Redis的高并发高吞吐特性背道而驰。
Pipeline(流水线)机制能改善上面这类问题,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端。这样就只要一次的往返时间。
值得注意的是:RTT在不同网络环境下会有不同,例如同机房和同机器会比较快,跨机房跨地区会比较慢。Redis命令真正执行的时间通常在微秒级别,所以才会有Redis性能瓶颈是网络这样的说法。
命令行的使用
cat redis-pipe.txt | redis-cli --pipe
PHP中的API使用
<?php
namespace Redis;
use Redis;
class RedisTest
{
const PORT = 6379;
/**
* redis对象
*/
public $redis = null;
public function __construct()
{
$this->redis = new Redis();
$this->redis->connect('127.0.0.1', self::PORT);
}
public function testPipeline()
{
$str_constant = get_class($this->redis) . '::PIPELINE';
if (!$str_constant) {
return 'pipeline no exit';
}
return $this->redis->pipeline()->publish('test', 'pipe-info')->exec();
}
}