写在前面
Redis是一个请求响应模型的TCP 服务,简单来说,客户端发送一个查询给服务端,然后服务端执行,将结果返回给客户端,期间客户端是阻塞状态,如下图
image.png image.png其中往返时长RTT(Round Trip Time)= Time1 + Time2,可以看到,如果客户端端发送N个请求,那么就会有N*Time1+N*Time2
的耗时在上面。
假设RTT为250ms
,就算服务端每秒可以处理10W
个请求,但是在单线程
的情况下客户端每秒最多只能处理4
个请求(250*4=1000ms),这很容易成为瓶颈。
优化思路就是减少RTT,采用的方案就是利用Redis的Pipeline
Redis pipeline
简单来说,Redis pipeline的原理就是将多个请求打包在一个TCP包中发给服务端处理,然后再一同读取结果。如下图:
image.png
pipeline的好处不只是减少了RTT,因为Socket/IO涉及到read()和write()的系统调用,而这种调用又会涉及到用户态和内核态的切换,这种切换也是一种很大的开销。
需要注意什么?
pipeline执行的结果会缓存在服务端,可以说是利用空间换时间的典型,所以,我们在打包发送命令的时候,要注意一次发送命令的数量不要太多。
参考资料
https://redis.io/topics/pipelining
https://www.alibabacloud.com/help/zh/doc-detail/26369.htm
https://redis.io/topics/pipelining
https://blog.csdn.net/u011489043/article/details/78769428
https://www.jianshu.com/p/7d7175e4616a
https://developpaper.com/redis-uses-pipeline-to-speed-up-query-speed/
https://developpaper.com/redis-throughput-enhancement-through-pipeline/
网友评论