客户端向服务器发送一个查询请求,并监听 socket 返回,等待服务器响应。通常是阻塞模式,在收到服务器响应之前是挂起的,不能继续发送请求。

可以使用管道来改善这种情况。在使用管道的情况下,客户端可以请求服务器而不必理会服务器是否有回复。这样就可以一次发出多个命令。

下面是 Jedis 一般情况下和开启管道后发送一系列请求所用时间的对比。

public class PipelineTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
withoutPipeline(jedis);
withPipeline(jedis); } private static void withoutPipeline(Jedis jedis){
long start = System.currentTimeMillis();
jedis.set("name", "gpf");
for (int i = 0; i < 1000; i++) {
jedis.append("name", "x");
}
long end = System.currentTimeMillis();
jedis.disconnect();
System.out.println("time withoutPipeline:"+(end-start));
System.out.println(jedis.get("name"));
} private static void withPipeline(Jedis jedis){
long start = System.currentTimeMillis();
jedis.set("name", "gpf");
Pipeline pl = jedis.pipelined();
for (int i = 0; i < 1000; i++) {
pl.append("name", "y");
}
pl.sync();
long end = System.currentTimeMillis();
System.out.println("time withPipeline:"+(end-start));
System.out.println(jedis.get("name"));
}
}

多次测试结果均如下面结果所示:

time withoutPipeline:158
gpfxxxxxxxxxxxxxxxxxxxxx...
time withPipeline:22
gpfyyyyyyyyyyyyyyyyyyyyy...

可以看出,开启管道后,效率提升显著。

开启管道后可以在短时间内插入大量记录。

Redis - pipelining(管道)的更多相关文章

  1. 第三百零一节,python操作redis缓存-管道、发布订阅

    python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...

  2. 【spring boot】spring boot 基于redis pipeline 管道,批量操作redis命令

    spring boot 2.x 使用RedisTemplate 操作 =================================== 1.pom.xml <!--spring2.0集成r ...

  3. Redis Pipelining

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...

  4. redis使用管道pipeline提升批量操作性能(php演示)

    Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户 ...

  5. python学习之-- redis模块管道/订阅发布

    redis 模块操作剩余其他常用操作 delete(*names):删除任意的数据类型exists(name):检测redis的name是否存在keys(pattern='*'):根据模型获取redi ...

  6. redis之管道

    Redis 的消息交互当我们使用客户端对 Redis 进行一次操作时,如下图所示,客户端将请求传送给服务器,服务器处理完毕后,再将响应回复给客户端.这要花费一个网络数据包来回的时间. 如果连续执行多条 ...

  7. redis 使用管道提升写入的性能[pipeline]

    看了手册的都知道multi这个命令的作用就好比是mysql的事务的功能,但是大家都知道事务吗,就是在操作的过程中,把整个操作当作一个原子来处理,避免由于中途出错而导致最后产生的数据不一致,而产生BUG ...

  8. Redis(六)管道(Pipelining)

    管道技术并不是Redis特有的,管道技术在计算机科学中有很多地方的应用. 来自wiki的解释: In computing, a pipeline, also known as a data pipel ...

  9. Redis进阶实践之十八 使用管道模式加速Redis查询

    一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前 ...

随机推荐

  1. mysql查询结果添加编号

    第一种方法: select   (@i:=@i+1)   as   i,table_name.*   from   table_name,(select   @i:=0)   as   it 第二种方 ...

  2. iOS开发中常用到的宏定义

    1.首次启动判断: #define First_Launched @"firstLaunch" 2.ios7系统判断: #define IsIOS7 ([[[UIDevice cu ...

  3. 利用AdaBoost元算法提高分类性能

    当做重要决定时,大家可能都会吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法背后的思路.元算法是对其他算法进行组合的一种方式. 自举汇聚法(bootstrap aggr ...

  4. 连接mysql问题 mysqlnd cannot connect to MySQL 4.1+ using old authentication

    第一篇:PHP5.3开始使用MySqlND作为默认的MySql访问驱动,而且从这个版本开始将不再支持使用旧的用户接口链接Mysql了,你可能会看到类似的提示: #2000 - mysqlnd cann ...

  5. MySQL乱码解决办法

    MySQL支持几十种编码方式,并且默认的编码为:latinl,如果MySQL出现了乱码情况,不要慌乱,一下为你介绍两种解决编码方式: 在控制台输入命令,注意MySQL中的UTF-8写成utf8,例如我 ...

  6. c#中关键词out和ref的区别

    c#中关键词out和ref用来表明以传引用的方式传递参数. 区别如下: 如果方法的参数用out标记,表示方法被调用前不需初始化参数,方法内不能读取此参数的值,在方法返回前必须向此参数写入值: 如果方法 ...

  7. Java反射的三种实现方式

    Foo foo = new Foo(); 第一种:通过Object类的getClass方法 Class cla = foo.getClass(); 第二种:通过对象实例方法获取对象 Class cla ...

  8. LeetCode Factor Combinations

    原题链接在这里:https://leetcode.com/problems/factor-combinations/ 题目: Numbers can be regarded as product of ...

  9. Oracle的Connect By理解

    connect by中的条件就表示了父子之间的连接关系 比如 connect by id=prior pid,但如果connect by中的条件没有表示记录之间的父子关系那会出现什么情况? 常见的,c ...

  10. Netty之有效规避内存泄漏

    有过痛苦的经历,特别能写出深刻的文章 —— 凯尔文. 肖 直接内存是IO框架的绝配,但直接内存的分配销毁不易,所以使用内存池能大幅提高性能,也告别了频繁的GC.但,要重新培养被Java的自动垃圾回收惯 ...