node-redis 不支持 ‘redis pipeline’该如何解决?
发布于 11 年前 作者 mrFranklin 8662 次预览 最后一次回复是 11 年前 来自 问答
我所说的‘redis pipeline’,是指多个redis命令的请求只产生一次网络IO(底层只发送一个包),这样减少了网络io的次数,因此就提高了性能。 经过抓包分析发现,目前的node-redis版本并不支持此功能。我去翻了一下issues,作者所指的pipeline,多个命令仍然是发送多次请求,只不过从server端的回复可能是一次而已。 后来我又试了一下python版本的redis客户端,发现它就是只发送一次请求的。 请问大家有没有遇到过类似问题? 如何解决的呢?是改了源代码,还是使用了别的库呢? 谢谢!
9 回复
按照这个例子写就可以啊: https://github.com/mranney/node_redis/issues/539#issuecomment-32203325
@yorkie 这个issue我看了,我的例子也是这么写的,但是就如我上面所说的,并不是只发送一次包的,是有几次请求就发送几个包的。用抓包软件就能看出来的。
@mrFranklin >.<
难道没人用过这个库吗? 那都用的什么连接redis啊~
刚刚也碰到了,我改用redis-stream了,lz也可以试试
@chemdemo 恩,感谢回复。我打算自己改一下源代码了~ 不太想一个项目里用俩同样功能的库。
我觉得pipeling的性能提升来自发送多个指令,但是只接收一次回复,而不是将多个指令合并成一个只发送一次请求。 虽然我没做过对比测试,但从理论上发送单个指令可以让redis服务器更早相应请求,所以性能比延迟一段时间再发送合并的指令性能要更好。
这里有一篇讨论 http://informatikr.com/2012/redis-pipelining.html 作者的结论是(我觉得这个有待测试验证)
好吧,根据官方说法,pipelining确实指的是指令合并。
但是在RTT很低,比如使用loopback interface时,没有进行指令合并的影响可以降到最小。
node_redis的“自动pipelining"其实并不是真正的pipelining,而是利用node的异步特性尽可能多地发送指令给redis。