zoukankan      html  css  js  c++  java
  • 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万一批的提交),避免超时

  • 相关阅读:
    HDU 4396
    Vijos1603 迷宫
    BZOJ1087 [SCOI2005] 互不侵犯King
    BZOJ2208 [JSOI2010] 连通数
    BZOJ1051 [HAOI2006] 受欢迎的牛
    BZOJ2751 [HAOI2012] 容易题(easy)
    BZOJ1015 [JSOI2008] 星球大战starwar
    BZOJ1012 [JSOI2008] 最大数maxnumber
    BZOJ1050 [HAOI2006] 旅行comf
    BZOJ2761 [JLOI2011] 不重复数字
  • 原文地址:https://www.cnblogs.com/LQBlog/p/13322274.html
Copyright © 2011-2022 走看看