<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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


    下面這個例子,在本地分別以普通請求和管道對一個鍵調(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ò)延時的問題,如果是在不同的網(wǎng)段測試的話,效果會更明顯。雖然管道在一定程度上對性能有所提升,但是在使用時一點要注意,每個命令的返回結(jié)果是先被緩存在服務(wù)器端的,最后一次性返回給客戶端。如果一次批量提交涉及大量的返回結(jié)果,可能會導(dǎo)至服務(wù)器的內(nèi)存溢出,這在生產(chǎn)環(huán)境是致命的,一次批次處理多少量,最好在設(shè)計階段做出合理評估。


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

    posted on 2016-12-20 15:25 jinfeng_wang 閱讀(146) 評論(0)  編輯  收藏 所屬分類: 2016-REDIS
    主站蜘蛛池模板: 亚洲精品无码AV中文字幕电影网站 | 亚洲人成网7777777国产| 中文字幕在线视频免费观看| 久久久久久久亚洲Av无码| 巨胸喷奶水视频www网免费| 黄色网址在线免费观看| 亚洲成色999久久网站| 成人免费视频一区| 天黑黑影院在线观看视频高清免费| 亚洲欧洲日产韩国在线| 免费观看午夜在线欧差毛片| 日本高清免费观看| 日韩色视频一区二区三区亚洲| 国产亚洲一区二区三区在线| 成人免费在线观看网站| 成人电影在线免费观看| 亚洲乱码国产乱码精华| 亚洲精品私拍国产福利在线| 国产a级特黄的片子视频免费| 久久aa毛片免费播放嗯啊| 日本免费久久久久久久网站| 精品丝袜国产自在线拍亚洲| 亚洲精品成人无码中文毛片不卡| 成年18网站免费视频网站| 国产成人精品免费久久久久| 日韩色日韩视频亚洲网站| 亚洲国产超清无码专区| 国产成人亚洲综合无码精品| 日本高清免费aaaaa大片视频| 亚洲香蕉免费有线视频| 国产免费久久精品99久久| 亚洲欧美日韩中文字幕一区二区三区| 亚洲avav天堂av在线不卡| 亚洲人成无码网站久久99热国产| 青娱分类视频精品免费2| 久久午夜无码免费| eeuss草民免费| 香港经典a毛片免费观看看| 日韩亚洲不卡在线视频中文字幕在线观看| 国产av天堂亚洲国产av天堂| 亚洲精品456播放|