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


pipeline

傳統我們redis 發送10萬個請求,requset-response 請求響應,需要等待一個請求發送到redid redis成功處理並響應才返回

我們線上有一塊兒代碼 要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

解惑

redis 管道是需要客戶端和服務端的支持,服務端需要能夠接受批量的命令並處理,客戶端 需要將命令寫入緩沖區最后一次發送,

Jedis客戶端緩存是8192,超過該大小則刷新緩存,或者直接發送

注意事項

多個大批量 盡量分批提交(如10萬 1萬一批的提交),避免超時


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM