jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
          http://blog.csdn.net/oyl822/article/details/44460949

          Redis是一個(gè)響應(yīng)式的服務(wù),當(dāng)客戶端發(fā)送一個(gè)請求后,就處于阻塞狀態(tài)等待Redis返回結(jié)果。這樣一次命令消耗的時(shí)間就包括三個(gè)部分:請求從客戶端到服務(wù)器的時(shí)間、結(jié)果從服務(wù)器到客戶端的時(shí)間和命令真正執(zhí)行時(shí)間,前兩個(gè)部分消耗的時(shí)間總和稱為RTT(Round Trip Time),當(dāng)客戶端與服務(wù)器存在網(wǎng)絡(luò)延時(shí)時(shí),RTT就可能會很大,這樣就會導(dǎo)致性能問題。管道(Pipeline)就是為了改善這個(gè)情況的,利用管道,客戶端可以一次性發(fā)送多個(gè)請求而不用等待服務(wù)器的響應(yīng),待所有命令都發(fā)送完后再一次性讀取服務(wù)的響應(yīng),這樣可以極大的降低RTT時(shí)間從而提升性能。


          下面這個(gè)例子,在本地分別以普通請求和管道對一個(gè)鍵調(diào)用2000次incr命令的測試

          [java] view plain copy
          1. public class App   
          2. {  
          3.     public static void main( String[] args ) {  
          4.         long start = System.currentTimeMillis();  
          5.         withoutPipeline();  
          6.         System.out.println("Without Pipeline takes: " + (System.currentTimeMillis() - start) + " ms.");  
          7.           
          8.         start = System.currentTimeMillis();  
          9.         withPipeline();  
          10.         System.out.println("With Pipeline takes: " + (System.currentTimeMillis() - start) + " ms.");  
          11.     }  
          12.       
          13.     public static void withPipeline() {  
          14.         Jedis jedis = null;  
          15.           
          16.         try {  
          17.             jedis = new Jedis("localhost", 6379);  
          18.             jedis.flushDB();  
          19.             Pipeline p = jedis.pipelined();  
          20.               
          21.             p.set("thekey", Integer.toString(0));  
          22.               
          23.             for (int i = 1; i <= 2000; i++) {  
          24.                 p.incr("thekey");  
          25.             }  
          26.               
          27.             Response<String> r = p.get("thekey");  
          28.               
          29.             p.sync();  
          30.               
          31.             System.out.println(r.get());  
          32.         } finally {  
          33.             jedis.close();  
          34.         }  
          35.           
          36.     }  
          37.       
          38.     public static void withoutPipeline() {  
          39.         Jedis jedis = null;  
          40.           
          41.         try {  
          42.             jedis = new Jedis("localhost", 6379);  
          43.             jedis.flushDB();  
          44.             jedis.set("thekey", Integer.toString(0));  
          45.               
          46.             for (int i = 1; i <= 2000; i++) {  
          47.                 jedis.incr("thekey");  
          48.             }  
          49.               
          50.             System.out.println(jedis.get("thekey"));  
          51.         } finally {  
          52.             jedis.close();  
          53.         }  
          54.           
          55.     }  
          56. }  
          57.   
          58. //輸出結(jié)果  
          59. 2000  
          60. Without Pipeline takes: 183 ms.  
          61. 2000  
          62. With Pipeline takes: 47 ms.  

          結(jié)果很直觀的反映出兩者的差別,要知道這是在本地測試,幾乎不存在網(wǎng)絡(luò)延時(shí)的問題,如果是在不同的網(wǎng)段測試的話,效果會更明顯。雖然管道在一定程度上對性能有所提升,但是在使用時(shí)一點(diǎn)要注意,每個(gè)命令的返回結(jié)果是先被緩存在服務(wù)器端的,最后一次性返回給客戶端。如果一次批量提交涉及大量的返回結(jié)果,可能會導(dǎo)至服務(wù)器的內(nèi)存溢出,這在生產(chǎn)環(huán)境是致命的,一次批次處理多少量,最好在設(shè)計(jì)階段做出合理評估。


          最后,管道只是一個(gè)方案,并不意味著在任何時(shí)候都要盡可能的使用它,而是應(yīng)該結(jié)合考慮網(wǎng)絡(luò)延遲時(shí)間、業(yè)務(wù)涉及的請求量等等因素綜合考慮,畢竟創(chuàng)建管道本身也會有一定的消耗。

          posted on 2016-12-20 15:25 jinfeng_wang 閱讀(146) 評論(0)  編輯  收藏 所屬分類: 2016-REDIS
          主站蜘蛛池模板: 嘉善县| 兰州市| 曲靖市| 林口县| 石景山区| 四会市| 静安区| 普兰县| 阿克陶县| 定安县| 扶绥县| 潼南县| 乡宁县| 乐东| 蒙自县| 景洪市| 华池县| 甘泉县| 德昌县| 周宁县| 东乌| 盈江县| 洪雅县| 乾安县| 米脂县| 上虞市| 贡觉县| 东宁县| 炉霍县| 手机| 灵宝市| 饶阳县| 尤溪县| 攀枝花市| 北辰区| 五台县| 四子王旗| 汝南县| 桃源县| 达州市| 红安县|