美文网首页
5 redis管道

5 redis管道

作者: lijiaccy | 来源:发表于2018-08-04 21:56 被阅读0次

    什么是redis管道首先看一个例子

    public static void test100w(){

       //第一个例子是直接用put插入
        Jedis jedis = new Jedis("172.30.154.123",6379);
        jedis.auth("123456"); 
       long start = System.currentTimeMillis();
        for (int i =0;i<100000;i++){
            jedis.set("key1"+i,"value"+i); 
       }
        long end = System.currentTimeMillis();
        System.out.println(end-start +"----普通set耗时");       
    
       //第二个使用管道
        start = System.currentTimeMillis();
        Pipeline p = jedis.pipelined();
        for (int i =0;i<100000;i++){ 
           p.set("key2"+i,"value"+i);
        }
        p.sync();
        end = System.currentTimeMillis(); 
       System.out.println(end-start +"----管道耗时");
        jedis.close();    }
    

    我本机的执行结果是:

    109539----普通set耗时
    497----管道耗时

    第一个直接set的,如果用多线程跑,会快一点,但是不可能达到管道这个时间。

    为什么管道这么快

    管道的定义:客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复。
    正常情况下,每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。
    那么有没有这种情况client不用读取返回结果,redis依旧可以处理新请求。这就是管道(Pipeline)
    通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。
    打包的命令越多,缓存消耗内存也越多。所以并是不是打包的命令越多越好。
    具体多少合适需要根据具体情况测试。当然,使用Pipeline需要一定的容错性。并不是所有的提交都会被成功执行,如果不能成功执行,那么会在所有提交执行之后打印错误。也就是说管道中前面命令失败,后面命令不会有影响,继续执行。

    管道的其他用法

    其实管道和普通的的Jedis之类一样,有相同的方法。比如set,get,hmset等等。自己去实验吧。
    这里我说的是用管道去删除有相同特性的的key。
    我没用代码,直接用命令行的下面两个是一样的,一个是有密码,一个是没密码连接redis而已。主要的还是keys "key*" 这里,我是删除了刚刚插入的所有开头为key的键

    src/redis-cli keys "key*" | xargs src/redis-cli del

    src/redis-cli -h 172.30.154.123 -p 6379 -a 123456 keys "key*" | xargs src/redis-cli -h 172.30.154.123 -p 6379 -a 123456 del

    相关文章

      网友评论

          本文标题:5 redis管道

          本文链接:https://www.haomeiwen.com/subject/ynqvvftx.html