1. 程式人生 > 實用技巧 >redis-使用-pipeline大批量提交提高效能

redis-使用-pipeline大批量提交提高效能

pipeline

傳統我們redis 傳送10萬個請求,requset-response 請求響應,改成了客戶端請求給服務端,不等待詳情,最後統一獲取響應結果

我們線上有一塊兒程式碼 要10多秒 才能響應,後面發現大批量redis查詢 改為管道就變成1秒內

效能對比測試

    public static void main(String[] args)
            throws Exception {
        Jedis conn = new Jedis("127.0.0.1", 6379);
        testMulti(conn);
       testPipeline(conn);
        test(conn);

    }

    
public static void testMulti( Jedis conn){ conn.del("testMulti"); Long start=System.currentTimeMillis(); Transaction t= conn.multi(); for(int i=0;i<100000;i++){ t.sadd("testMulti",String.valueOf(i)); } t.exec(); Long end=System.currentTimeMillis(); System.out.println(
"testMulti耗時"+(end-start)+"毫秒"); } public static void testPipeline( Jedis conn){ conn.del("testPipeline"); Long start=System.currentTimeMillis(); Pipeline pipeline=conn.pipelined(); for(int i=0;i<100000;i++){ pipeline.sadd("testPipeline",String.valueOf(i)); } pipeline.syncAndReturnAll(); Long end
=System.currentTimeMillis(); System.out.println("testPipeline耗時"+(end-start)+"毫秒"); } public static void test( Jedis conn){ conn.del("test"); Long start=System.currentTimeMillis(); for(int i=0;i<100000;i++){ conn.sadd("test",String.valueOf(i)); } Long end=System.currentTimeMillis(); System.out.println("test耗時"+(end-start)+"毫秒"); }

輸出

testMulti耗時380毫秒  
testPipeline耗時360毫秒
test耗時4655毫秒
如果改為100萬次 multi拿結果的時候會超時

疑惑

網上說是一直髮非事物處理,但是並不等待結果,按理說,傳送後 get應該是修改的值,但是我測試沒有呼叫syncAndReturnAll redis並沒有修改

        Jedis conn = new Jedis("127.0.0.1", 6379);
        Pipeline pipeline= conn.pipelined();
        pipeline.set("test5","6");
        Thread.sleep(10000);//這個時候另外一個執行緒去讀取 test5是null
        pipeline.syncAndReturnAll();//這一句執行完後 get test5獲取到6