redis pipeline

redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常 会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下

Client: INCR XServer: 1Client: INCR XServer: 2Client: INCR XServer: 3Client: INCR XServer: 4

基 本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从client和server之间的包传输时间需要0.125秒。那么上面的四个命 令8个报文至少会需要1秒才能完成。这样即使redis每秒能处理100个命令,而我们的client也只能一秒钟发出四个命令。这显示没有充分利用 redis的处理能力。除了可以利用mget,mset 之类的单条命令处理多个key的命令外
我们还可以利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下

Client: INCR XClient: INCR XClient: INCR XClient: INCR XServer: 1Server: 2Server: 3Server: 4

假 设不会因为tcp 报文过长而被拆分。可能两个tcp报文就能完成四条命令,client可以将四个incr命令放到一个tcp报文一起发送,server则可以将四条命令 的处理结果放到一个tcp报文返回。通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打 包的命令越多越好。具体多少合适需要根据具体情况测试。

下面是个Java使用pipeline的实验:

import org.jredis.JRedis;
import org.jredis.connector.ConnectionSpec;
import org.jredis.ri.alphazero.JRedisClient;
import org.jredis.ri.alphazero.JRedisPipelineService;
import org.jredis.ri.alphazero.connection.DefaultConnectionSpec;

public class TestPipeline {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        //采用pipeline方式发送指令
        usePipeline();
        long end = System.currentTimeMillis();
        System.out.println("用pipeline方式耗时:" + (end - start) + "毫秒");

        start = System.currentTimeMillis();
        //普通方式发送指令
        withoutPipeline();
        end = System.currentTimeMillis();
        System.out.println("普通方式耗时:" + (end - start) + "毫秒");
    }

    //采用pipeline方式发送指令
    private static void usePipeline() {
        try {
            ConnectionSpec spec = DefaultConnectionSpec.newSpec(
                    "192.168.115.170", 6379, 0, null);
            JRedis jredis = new JRedisPipelineService(spec);

            for (int i = 0; i < 100000; i++) {
                jredis.incr("test2");
            }

            jredis.quit();
        } catch (Exception e) {
        }
    }

    //普通方式发送指令
    private static void withoutPipeline() {
        try {
            JRedis jredis = new JRedisClient("192.168.115.170", 6379);

            for (int i = 0; i < 100000; i++) {
                jredis.incr("test2");
            }

            jredis.quit();
        } catch (Exception e) {
        }
    }
}

执行结果如下:

-- JREDIS -- INFO: Pipeline thread <response-handler> started. 
-- JREDIS -- INFO: Pipeline <[email protected]fa> connected 
用pipeline方式耗时:11531毫秒
-- JREDIS -- INFO: Pipeline <[email protected]fa> disconnected 
-- JREDIS -- INFO: Pipeline thread <response-handler> stopped. 
普通方式耗时:15985毫秒

  所以用两种方式发送指令,耗时是不一样的,具体是否使用pipeline必须要基于大家手中的网络情况来决定,不能一切都按最新最好的技术来实施,因为它有可能不是最适合你的。

参考:

http://redis.io/topics/pipelining

http://www.cnblogs.com/redcreen/archive/2011/02/15/1955517.html

redis pipeline

时间: 2024-10-03 06:34:49

redis pipeline的相关文章

(7)redis pipeline

redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常 会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client.基本的通信过程如下 Client: INCR X Server: 1 Client: INCR X Server: 2 Client: INCR X Server: 3 Client: INCR X Server: 4

Java实现Redis pipeline比较

开始实验这个,是因为Redis实战.pdf上面有例子. 上面用的是 org.jredis包,可是发现这个包不在maven的公共仓库里.需要先下载然后放在本地,导入maven依赖.详见: http://blog.csdn.net/zhu_tianwei/article/details/44900955 https://github.com/alphazero/jredis 在Redis实战.pdf上也有例子. 而Maven公共仓库提供的是jedis包.网上也有例子: http://www.tuic

Redis资料汇总(五) redis pipeline

redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常 会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client.基本的通信过程如下 Client: INCR X Server: 1 Client: INCR X Server: 2 Client: INCR X Server: 3 Client: INCR X Server: 4

redis管道(pipeline)

redis pipeline redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常 会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client.基本的通信过程如下: (Client)127.0.0.1:6379> incr x (Server)(integer) 1 (Client)127.0.0.1:6379> incr x (

redis通过pipeline提升吞吐量

案例目标 简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用. 案例背景 应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元: 然而在某些服务中,数据操作对redis 是强依赖的,在最近的一次分析中发现: 一次数据推送会对 redis 产生近30次读写操作! 在数据推送业务中的性能压测中,以数据上报 -> 下发应答为一次事务: 而对于这样的读写模型,redis 的操作过于频繁,很快便导致系统延时过高,吞吐量低下,无法满足目标:

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

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

redis性能提升之pipeline

1.以前正常使用过程 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户端. 也就是每个命令都会有一来以往的过程 2.管道的意义 如果能将连续执行的redis命令在操作完成后统一返回,就可以减少连接数,从来减少延迟时间,那么管道也就产生了. 管道的基本含义是,客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复. 3.参数说明: Redis::MULTI或Redis::PIPELINE. 默认是 Redis::MUL

使用Python操作Redis

1. 安装pyredis 首先安装pip 1 2 3 4 5 6 7 8 <SHELL># apt-get install python-pip ...... <SHELL># pip install --proxy=http://172.1.2.6:8080 redis Downloading redis-2.9.1.tar.gz (62kB): 62kB downloaded Running setup.py (path:/tmp/pip_build_root/redis/se

redis中文文档

phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/owlient/phpredis(支持redis 2.0.4) Redis::__construct构造函数$redis = new Redis(); connect, open 链接redis服务参数host: string,服务地址port: int,端口号timeout: float,链接时长 (