文档章节

Redis管道(pipeline)

凯文加内特
 凯文加内特
发布于 2015/06/10 08:29
字数 740
阅读 273
收藏 4

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

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

Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4

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

package com.jd.redis.client;
 
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
 
publicclass PipelineTest {
 
    /**
     * @param args
     */
    publicstaticvoid main(String[] args) {
       
        int count = 1000;
       
        long start = System.currentTimeMillis();
        withoutPipeline(count);
        long end = System.currentTimeMillis();
        System.out.println("withoutPipeline: " + (end-start));
       
        start = System.currentTimeMillis();
        usePipeline(count);
        end = System.currentTimeMillis();
        System.out.println("usePipeline: " + (end-start));
       
    }
 
    privatestaticvoid withoutPipeline(int count){
        Jedis jr = null;
        try {
            jr = new Jedis("10.10.224.44", 6379);
            for(int i =0; i<count; i++){
                jr.incr("testKey1");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            if(jr!=null){
                jr.disconnect();
            }
        }
    }
   
    privatestaticvoid usePipeline(int count){
        Jedis jr = null;
        try {
            jr = new Jedis("10.10.224.44", 6379);
            Pipeline pl = jr.pipelined();
            for(int i =0; i<count; i++){
                 pl.incr("testKey2");
            }
                pl.sync();
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            if(jr!=null){
                jr.disconnect();
            }
        }
    }
}

输出:

withoutPipeline: 11341
usePipeline: 344

测试结果还是很明显有较大的差距,所以多次操作用pipeline还是有明显的优势。我用的是Win7中的Jedis Java客户端程序连接局域网的Linux虚拟机上的Redis Server

本文转载自:http://blog.csdn.net/freebird_lb/article/details/7778919

共有 人打赏支持
凯文加内特
粉丝 337
博文 678
码字总数 103855
作品 0
青岛
后端工程师
私信 提问
分布式缓存Redis之Pipeline(管道)

分布式缓存Redis之Pipeline(管道) 写在前面   本学习教程所有示例代码见GitHub:https://github.com/selfconzrr/Redis_Learning   Redis的pipeline(管道)功能在命令行中没有,但redis...

优惠券活动
2018/07/24
0
0
redis分布式锁方案

目录: 1.pipeline 2.跨jvm的id生成器 3.跨jvm的锁实现(watch multi) 4.redis分布式 1. Pipeline 官方的说明是:starts a pipeline,which is a very efficient way to send lots of command......

tony.chen
2016/12/26
24
0
Redis中RedisTemplate和Redisson管道的使用

当对Redis进行高频次的命令发送时,由于网络IO的原因,会耗去大量的时间。所以Redis提供了管道技术,就是将命令一次性批量的发送给Redis,从而减少IO。 一、Jedis对redis的管道进行操作 1、获...

宇的季节
2018/03/22
0
0
Python client for Redis 官翻文档2.10.1(三)

Pipelines 管道 管道是Redis的子类,它支持缓冲多个命令,一次性发送到服务器去执行。可以大大的提高性能,减少服务器到客户端之间的TCP来回数据包。 管道的简单使用: >>> r = redis.Redis(....

山下狮子
2014/06/20
0
0
Python client for Redis 官翻文档2.10.1(一)

Python client for Redis key-value store redis针对python的客户端, github地址:https://github.com/andymccurdy/redis-py/ 安装: 虽然称redis的python客户端称为redis-py,实际安装时的......

山下狮子
2014/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
11
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
7
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部