redis的pipeline机制解析与注意事项

本文详细介绍了 Redis 的 Pipeline 机制,包括其底层实现原理及如何通过优化客户端行为避免程序阻塞。探讨了 redisvAppendCommand 和 redisGetReply 的工作流程,并提出了一种改进方案。
摘要由CSDN通过智能技术生成
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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值