Redis是一个响应式的服务,当client发送一个请求后,就处于堵塞状态等待Redis返回结果。

这样一次命令消耗的时间就包含三个部分:请求从client到server的时间、结果从server到client的时间和命令真正运行时间,前两个部分消耗的时间总和称为RTT(Round Trip Time)。当client与server存在网络延时时,RTT就可能会非常大,这样就会导致性能问题。

管道(Pipeline)就是为了改善这个情况的。利用管道,client能够一次性发送多个请求而不用等待server的响应,待全部命令都发送完后再一次性读取服务的响应,这样能够极大的减少RTT时间从而提升性能。

以下这个样例。在本地分别以普通请求和管道对一个键调用2000次incr命令的測试。

public class App
{
public static void main( String[] args ) {
long start = System.currentTimeMillis();
withoutPipeline();
System.out.println("Without Pipeline takes: " + (System.currentTimeMillis() - start) + " ms."); start = System.currentTimeMillis();
withPipeline();
System.out.println("With Pipeline takes: " + (System.currentTimeMillis() - start) + " ms.");
} public static void withPipeline() {
Jedis jedis = null; try {
jedis = new Jedis("localhost", 6379);
jedis.flushDB();
Pipeline p = jedis.pipelined(); p.set("thekey", Integer.toString(0)); for (int i = 1; i <= 2000; i++) {
p.incr("thekey");
} Response<String> r = p.get("thekey"); p.sync(); System.out.println(r.get());
} finally {
jedis.close();
} } public static void withoutPipeline() {
Jedis jedis = null; try {
jedis = new Jedis("localhost", 6379);
jedis.flushDB();
jedis.set("thekey", Integer.toString(0)); for (int i = 1; i <= 2000; i++) {
jedis.incr("thekey");
} System.out.println(jedis.get("thekey"));
} finally {
jedis.close();
} }
} //输出结果
2000
Without Pipeline takes: 183 ms.
2000
With Pipeline takes: 47 ms.

结果非常直观的反映出两者的区别。要知道这是在本地測试,差点儿不存在网络延时的问题。假设是在不同的网段測试的话,效果会更明显。

尽管管道在一定程度上对性能有所提升,可是在使用时一点要注意。每一个命令的返回结果是先被缓存在server端的,最后一次性返回给client。假设一次批量提交涉及大量的返回结果,可能会导至server的内存溢出。这在生产环境是致命的。一次批次处理多少量,最好在设计阶段做出合理评估。

最后,管道仅仅是一个方案。并不意味着在不论什么时候都要尽可能的使用它。而是应该结合考虑网络延迟时间、业务涉及的请求量等等因素综合考虑。毕竟创建管道本身也会有一定的消耗。


最新文章

  1. [Head First设计模式]策略模式
  2. ML-线性回归
  3. Django--models多对多
  4. 容器--EnumMap
  5. BZOJ 1036: [ZJOI2008]树的统计Count
  6. &lt;c:if&gt;标签判断是否为空
  7. 淘宝开放平台TOP测试环境
  8. codeforces #313 div1 A
  9. Elasticsearch 安装与集群配置
  10. Java中Overload和Override的区别
  11. Python全栈考试(一)
  12. 背景新增属性和css渐变及倒影
  13. JFinal 极速开发框架的优点和不足的地方
  14. 移动设备分辨率(终于弄懂了为什么移动端设计稿总是640px和750px)
  15. 洛谷-p4555
  16. OO课程第三次总结QWQ
  17. 小程序点击事件改变样式(普通js鼠标点击事件)
  18. linux运维常见英文报错中文翻译(菜鸟必知)
  19. PAT 1018 Public Bike Management[难]
  20. samba服务器的安装与配置(之前是因为没有把共享文件权限放开!)(windows7和centOS6)

热门文章

  1. ES6 export default 和 export 的区别
  2. 洛谷——P3939 数颜色(暴力vecotr+二分)
  3. luogu P1618 三连击(升级版)
  4. 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)
  5. luogu3563 逛公园
  6. 大数据学习——hdfs集群启动
  7. asp.net 引发类型为“System.OutOfMemoryException”的异常
  8. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。
  9. BZOJ1592: [Usaco2008 Feb]Making the Grade 路面修整
  10. hdu4115:Eliminate the Conflict