[redis]redis中的pipeline

redis中的pipeline

second60  20181101

1 单操作命令分析

单操作命令操作时间 = 1次网络往返 + 1次命令执行

假如一次get key,那么是单次操作

 

2 批量操作命令分析

如果我们要得到n个key, 如果循环调用get,那么

循环操作单次命令时间= n次网络往返+ n次命令执行.

[redis]redis中的pipeline_第1张图片

为此,redis中提供了批量操作的命令,如mget, mset,有效的减少RTT网络时间

批量操作命令时间 = 1次网络往返 + n 次命令执行

 

但是,这只支持单类命令的批量操作,如果我要同时发送不同命令,同时操作,怎么办?

这也就出现了pipeline.

 

3 pipeline简介

pipeline 支持同时发送多条不同类型的命令,并一次性得到结果!!!

pipeline操作时间 = 1次网络往返 + n次命令执行

[redis]redis中的pipeline_第2张图片

pipeline解决了2中不同同时批量命令操作的问题。

pipeline(流水线)能将一组redis命令进行组装,通过一次RTT传输给redis,再将这组redis命令的执行结果按顺序返回给客户端。

4 pipeline的使用

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

 

5 性能对比

操作类型

操作时间

是否支持多命令

效率

缺点

循环单命令

n次网络+n次命令

支持

速度最慢

批量命令

1次网络+n次命令

不支持

不支持多节点

pipeline

1次网络+n次命令

支持

不支持多节点

6 pipeline的优缺点

优点:

  1. 可以同时操作多条命令
  2. 速度快

缺点:

  1. 命令个数要有节制,不能数据量太大(可能会造成网络拥塞,太多可拆分多个小pipeline)
  2. 只能操作一个节点,不能同时操作多个节点,在分布式中,要注意使用

7 hiredis中pipline的使用

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 & pipeline_cmd:pipeline处理的多个请求命令字符串

std::vector &pipeline_resp:pipeline处理的多个请求返回的字符串

std::vector &pipeline_resp_status:pipeline处理的多个请求返回的状态

 

你可能感兴趣的:(REDIS)