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万一批的提交),避免超时

  • 相关阅读:
    JavaScript构造函数学习笔记
    JavaScript面向对象编程学习笔记
    Maven学习--Maven项目目录、Maven坐标
    Maven学习--安装说明
    Watir问题---gem install watir-classic报错: ERROR: Error installing watir-classic: ERROR: Failed to build gem native extension.
    TestLink问题 —图表中文乱码
    TeskLink—增加一种需求类型(业务流程)(version1.9.8)
    Watir问题--LoadError: cannot load such file -- watir-classic
    Watir--Ruby + Watir环境安装
    Watir问题--Selenium::WebDriver::Error::WebDriverError: unexpected response, code=502, content-type="text/html"
  • 原文地址:https://www.cnblogs.com/LQBlog/p/13322274.html
Copyright © 2011-2022 走看看