second60 20181101
单操作命令操作时间 = 1次网络往返 + 1次命令执行
假如一次get key,那么是单次操作
如果我们要得到n个key, 如果循环调用get,那么
循环操作单次命令时间= n次网络往返+ n次命令执行.
为此,redis中提供了批量操作的命令,如mget, mset,有效的减少RTT网络时间
批量操作命令时间 = 1次网络往返 + n 次命令执行
但是,这只支持单类命令的批量操作,如果我要同时发送不同命令,同时操作,怎么办?
这也就出现了pipeline.
pipeline 支持同时发送多条不同类型的命令,并一次性得到结果!!!
pipeline操作时间 = 1次网络往返 + n次命令执行
pipeline解决了2中不同同时批量命令操作的问题。
pipeline(流水线)能将一组redis命令进行组装,通过一次RTT传输给redis,再将这组redis命令的执行结果按顺序返回给客户端。
redis-cli的--pipe选项实际上就是使用Pipeline机制,例如下面操作将set
hello world和incr counter两条命令组装:
echo -en '*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n*2\r\n$4\r\nincr\r\
n$7\r\ncounter\r\n' | redis-cli --pipe
操作类型 |
操作时间 |
是否支持多命令 |
效率 |
缺点 |
循环单命令 |
n次网络+n次命令 |
支持 |
低 |
速度最慢 |
批量命令 |
1次网络+n次命令 |
不支持 |
高 |
不支持多节点 |
pipeline |
1次网络+n次命令 |
支持 |
高 |
不支持多节点 |
优点:
缺点:
int pipeline_process(struct timeval access_timeout, std::vector & pipeline_cmd, std::vector &pipeline_resp, std::vector &pipeline_resp_status)
{
if (0 == redis_ctx) {return -1;}
redisSetTimeout(redis_ctx, access_timeout);
for (int i = 0; i < pipeline_cmd.size();i++)
{
redisAppendCommand(redis_ctx, pipeline_cmd[i].c_str());
}
for (int i = 0; i < pipeline_cmd.size();i++)
{
bool status = false;
std::string resp_str = "";
redisReply *reply = 0;
if(redisGetReply(redis_ctx, (void **)&reply) == REDIS_OK
&& reply != NULL
&& reply->type == REDIS_REPLY_STRING)
{
status = true;
resp_str = reply->str;
}
//free
freeReplyObject(reply);
pipeline_resp_status.push_back(status);
pipeline_resp.push_back(resp_str);
}
return 0;
}
参数:
struct timeval access_timeout:访问的超时时间
std::vector
std::vector
std::vector