redis的pipeline机制解析与注意事项
2014-07-29 18:30
351 查看
redis的pipeline机制
主要的两个底层函数:
1.redisvAppendCommand将命令拷贝到context的obuf里
2.redisGetReply:
1)从reply队列里面返回最前面的reply,如果队列为空,继续后面的操作
2)如果发现obuf中有数据没有发送,那么发送cmd
3)等待回包(server会把cmd中所有的处理做完,然后回包,appand过几次,server就会返回几个reply);收到回包后,redisGetReply里面解析回包为reply(可能为多个,具体数量跟appand次数相同);然后返回最前面的reply
实现剖析:
1.非pipeline模式直接调用redisCommand也是变成redisvAppendCommand + __redisBlockForReply(redisGetReply)
2.pipeline模式就是N次redisvAppendCommand + N次redisGetReply
症结所在:
redisGetReply是纯粹的client行为,server并不知道。如果调用的appand次数与getreply次数不匹配,会引起混乱。
如果多调用了redisGetReply,那么就会直接block
抛砖引玉:
为了不让多一次的redisGetReply导致整个程序block挂住,可以修改hiredis的redisGetReply的实现:如果replylist为空并且outbuf中也没有数据的时候,直接返回数据为空的reply
主要的两个底层函数:
1.redisvAppendCommand将命令拷贝到context的obuf里
2.redisGetReply:
1)从reply队列里面返回最前面的reply,如果队列为空,继续后面的操作
2)如果发现obuf中有数据没有发送,那么发送cmd
3)等待回包(server会把cmd中所有的处理做完,然后回包,appand过几次,server就会返回几个reply);收到回包后,redisGetReply里面解析回包为reply(可能为多个,具体数量跟appand次数相同);然后返回最前面的reply
实现剖析:
1.非pipeline模式直接调用redisCommand也是变成redisvAppendCommand + __redisBlockForReply(redisGetReply)
2.pipeline模式就是N次redisvAppendCommand + N次redisGetReply
症结所在:
redisGetReply是纯粹的client行为,server并不知道。如果调用的appand次数与getreply次数不匹配,会引起混乱。
如果多调用了redisGetReply,那么就会直接block
抛砖引玉:
为了不让多一次的redisGetReply导致整个程序block挂住,可以修改hiredis的redisGetReply的实现:如果replylist为空并且outbuf中也没有数据的时候,直接返回数据为空的reply
相关文章推荐
- Redis之Pipeline使用注意事项
- php使用js保存的json cookie 字符串,然后解析成数组,需要注意的事项
- strcpy面试题的解析和注意事项
- GPS服务端解析程序编写日记之--vs2010中多种语言开发及调试的若干注意事项
- Asynctask解析以及注意事项
- Servlet上传文件详细解析以及注意事项
- 链接器解析外部符号的过程 深入理解计算机系统 P475 注:在链接时的注意事项
- android proguard注意事项(json的解析请注意)
- Servlet上传文件详细解析以及注意事项
- Servlet上传文件详细解析以及注意事项
- 深入解析Nginx的pcre库及相关注意事项
- Java语言中定义常量注意事项解析
- Java语言中定义常量注意事项解析
- XCode解析xml配置注意事项
- 在J2ME下用KXML解析XML需要注意的事项
- ironpython2.6解析xml注意事项
- 域名解析成相应Ip是注意事项
- Servlet上传文件详细解析以及注意事项
- Asynctask解析以及注意事项
- 解析:使用php mongodb扩展时 需要注意的事项