Redis - pipelining(管道)

客户端向服务器发送一个查询请求,并监听 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...

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

时间: 2024-10-09 03:33:34

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

&lt;Redis&gt;&lt;Pipelining&gt;

Overview About Redis pipelining About Redis memory optimization About Redis expire About Redis transactions Pipelining Request/Response protocols and RTT Redis is a TCP server using the client-server model and what is called a Request/Response protoc

redis pipe管道

redis命令在从提交到返回处理结果的过程中,消耗的时间我们称之为RTT(往返时间). 在需要批量执行redis 命令的场景下,如果命令单条逐个执行,那么总共花费的时间是命令条数 N * RTT. redis 提供了管道技术来提高批量执行效率,即将多个命令打包发送给redis服务端,所有命令执行完后,再将所有结果打包返回. 在所有命令执行结束前,redis服务器会缓存已执行结束的结果. 在redis-cli命令行中, 使用redis管道技术时,我们通常将待执行的命令放到一个文本里,比如comma

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

Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户端. 如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,有redis服务器依次执行,并返回结果, 为了解决此类问题,设计者设计出了redis管道命令: 客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复,从而大大增加了协议性能 做了测试,使用pipeline

redis之管道——pipeline

redis 是 CS 模式,Redis客户端与Redis之间使用TCP协议进行连接,一个客户端可以通过一个socket连接发起多个请求命令,每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client,因此当执行多条命令的时候都需要等待上一条命令执行完毕才能执行.如果一次性批量数据单次操作,会有网络延迟.而redis也是单线程的. 而Pipelining可以满足批量的操作,把多个命令连续的发送给Redis Server,然后

使用python操作redis(管道)

一.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py. redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用.如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接. 安装redis pip install re

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

看了手册的都知道multi这个命令的作用就好比是mysql的事务的功能,但是大家都知道事务吗,就是在操作的过程中,把整个操作当作一个原子来处理,避免由于中途出错而导致最后产生的数据不一致,而产生BUG ,Mysql的事务功能可以做到这点,但是在redis中的multi,手册中说是把多个命令当作个事务来处理,但是在真正的测试之后发现并没有所说的事务的功能,个人经过测试发现,只有把他watch命令结合起来用,方可显现出其具有事务的功能,所以这点很是迷惑,关键是有一点很诧异,当启用了multi命令之后

redis 的管道操作

#-*- coding: utf8 -*- import redis pool = redis.ConnectionPool() r = redis.Redis(connection_pool=pool) # 支持事务 pipe = r.pipeline(transaction=True) pipe.multi() pipe.set("user", "egon") pipe.set("role", "sb") pipe.exe

Redis(六)管道(Pipelining)

管道技术并不是Redis特有的,管道技术在计算机科学中有很多地方的应用. 来自wiki的解释: In computing, a pipeline, also known as a data pipeline,[1] is a set of data processing elements connected in series, where the output of one element is the input of the next one. The elements of a pipe

redis翻译_redis管道

Redis is a TCP server using the client-server model and what is called a Request/Response protocol. redis使用的是基于tcp协议的client-server模型,也可以叫做Request/Response 协议模型. This means that usually a request is accomplished with the following steps: 它的意思是指通常一个请求完