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