1、pipeline原理
redis是一个cs模式的tcp server,使用和HTTP类似的请求响应协议。通过ip+port的形式构建连接,发起请求命令。每个请求发出后client通常会阻塞并等待redis服务处理完毕返回响应。
原理清楚了,抱着提高效率的目的,我们自然会想一来一回、一来一回。类似
Req
Rsp
Req
Rsp
Req
Rsp
的形式,我们是否有改进提升的空间呢?明显是有的,特别是在连续多条命令不影响后续命令执行的情况下,我们可以采取多量少次的做法来减少网络交互与等待时间。也就是说可以改成类似下边的形式:
container
add Req
add Req
add Req
send
accept Rsp
这样一来,其实就可以看出至少节省了redis回传次数。如果add是在本地实现的话,那就直接从6次降到了2次了。(ps:这个我不是十分确定,有可能是在本地积累,有可能是在redis服务端积累)。O(∩_∩)O哈哈~,这就是redis pipeline(管道)的功用。批量执行命令,然后结果一次性返回。
2、实践
那到底使用之后性能提升如何呢?本次实践如下:
处理数据量(100000)(ps:和redis交互只是程序极小一部分,在此仅供对比使用)
HINCRBY逐条执行 程序耗时850+秒
利用pipeline 10000条执行一次 程序耗时600+秒
省时4分钟左右,占程序总时间大概30%左右
效果还是比较明显的
主体代码如下:
使用的客户端来自于Redis官方网站,是Redis推荐的基于C接口的客户端组件,见如下链接:https://github.com/antirez/hiredis
for(int i=0; i
{ <wbr><wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>if (REDIS_OK != redisAppendCommand(temp_xx, command))</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>{ <wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>WriteLog("[WARNING]:Can'tadd command to reids!\n");</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>}</wbr></wbr></wbr></wbr>
} <wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>
if (REDIS_OK != redisGetReply(temp_xx, (void**)&temp_yy))
<wbr><wbr><wbr><wbr>WriteLog("[WARNING]:pipeline process to redis failed\n");</wbr></wbr></wbr></wbr>
其中temp_xx是redisContext,temp_yy是redisReply
3、误区
本次遇到问题具体原因我也没完全弄清楚,不过还是把它记录下来,当备忘吧。不知道是程序多线程原因还是本身pipeline与前后共用同一个redisContext会存在问题,我这次直接利用之前已存在的线程内全局redisContext时,会引发别处HGET返回结果内容出错。
用temp_xx和temp_yy(都是局部新建redisContext和redisReply)之后问题得到解决。我估计后者引发可能性更大些。
4、总结
(1)pipeline主要提升在与redis交互的网络延迟时间,对于多条命令不要求实时执行的情形而言,效果较为明显
(2)使用时最好注意一下pipeline执行的redisContext和redisReply(如果遇到诡异问题,可以尝试一下使用局部新建、独占两者进行处理的方式)
相关推荐
redis pipleLine
本篇文章主要介绍了Java使用Pipeline对Redis批量读写(hmset&hgetall),具有一定的参考价值,有兴趣的可以了解一下。
RedisPipe - 具有隐式流水线操作的Go开发的高吞吐量Redis客户端
简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用。 案例背景 应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元; 然而在某些服务中,数据操作对redis 是强...
Redis-PipeLine批量导入.docx
主要给大家介绍了关于Redis利用Pipeline加速查询速度的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了在Redis集群中使用pipeline批量插入的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
用了很久的redis了。...下面就更大家演示一下pipeline在python环境下的使用情况。 1、插入数据 >>> import redis >>> conn = redis.Redis(host='192.168.8.176',port=6379) >>> pipe = conn.pipeline() >>> pipe.
kettle如何3秒内写入100万条数据到Redis https://blog.csdn.net/huryer/article/details/106889792
Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次性响应多个命令。 Redis使用的是客户端-服务器模型和请求/响应协议的TCP服务器,这就意味着一个请求要有...
ISP库使用redis格式转换shell脚本 将csv的ISP库文件转化为redis pipeline的命令
前言 Redis服务是一种C/S模型,提供请求-响应式协议的TCP服务,所以当客户端请求发出,服务端处理并返回结果到客户端,...Pipeline简介 Redis客户端执行一条命令: 发送命令 命令排队 执行命令 返回结果 其中发
java客户端不是很好支持redis cluster,spring-date-redis和jedis批量提交还不支持,单个提交都是可以的。...使用的spring版本是4.3.2以下版本可能不是很好支持,jedis版本是2.8.2, spring-data-redis版本是1.7.2。
一、 redis 环境搭建 2 二、 redis学习笔记之...五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31
同意-Redis-Wrappers 这些是Appgree使用的类,用于封装和改进Jedis客户端,从而增加了流水线功能,主从控制和本地内存缓存,从而减少了不同线程重复读取的需求。 这些类可以单独使用或嵌套使用。执照该软件受Apache ...
【中间件篇-Redis缓存数据库】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)