redis pipeline

摘要:
Redis是一个cs模式的tcpserver,它使用类似于http的请求响应协议。客户端可以通过套接字连接发送多个请求命令。在发送每个请求命令后,客户端通常会阻止并等待Redis服务进行处理。Redis处理请求命令后,将通过响应消息将结果返回给客户端。基本通信过程如下:Client:INCRXServer:1Client:INCRXServer:2Client:INCRXS

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
基 本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从client和server之间的包传输时间需要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必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打 包的命令越多越好。具体多少合适需要根据具体情况测试。
下面是个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 <org.jredis.ri.alphazero.connection.SynchPipelineConnection@1bf73fa> connected 
用pipeline方式耗时:11531毫秒
-- JREDIS -- INFO: Pipeline <org.jredis.ri.alphazero.connection.SynchPipelineConnection@1bf73fa> 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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ActivityManagerService的启动过程mysql5.7基于gtid主从重做下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

top命令

收集了两篇关于介绍Linux中监控命令top命令的详细使用方法的文章。总的来说,top命令主要用来查看Linux系统的各个进程和系统资源占用情况,在监控Linux系统性能方面top显得非常有用,下面就是我收集的关于Linux top命令的文章,希望能帮到大家 top作为日常管理工作中最常用也是最重要的Linux 系统监控工具之一,可以动态观察系统进程状况。...

windows CMD大全

windows CMD大全参考:https://www.cnblogs.com/accumulater/p/7110811.html 一、打开CMD界面流程: CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)     二 、CMD命令锦集 A:基本操作命令       1. gpedit.ms...

Redis缓存数据库安全加固指导(一)

背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一位,但是原生Redis版本在安全方面非常薄弱,很多地方不满足安全要求,如果暴露在公网上,极易受到恶意攻击,导致数据泄露和丢失。 本文主要是在原生开源软件Red...

Java 开发 2.0: 现实世界中的 Redis

原文地址:http://www.ibm.com/developerworks/cn/java/j-javadev2-22/ 之前,我已在本系列中讨论过 NoSQL 的概念,也介绍了一些与 Java 平台兼容的 NoSQL 数据存储,其中包括 Google 的 Bigtable 和 Amazon 的 SimpleDB。此外,我还讨论过较为常见的基于服务器的...

sed的使用

1 SED 手册 中央研究院计算中心ASPAC 计划(刘刚2008年5月7号整理ganghust@gmail.com) aspac@phi.sinica.edu.tw 技术报告: 96005 1996年12月1日Version:1.0 SED 手册..........................................................

Redis学习-数据类型(二)

在安装好redis,也了解了如何启动和关闭服务端/客户端之后,继续学习redis的基本数据类型 redis的数据类型有五种,分别是 字符串 散列(哈希) 列表 集合 有序集合 redis也是一种基于内存的数据库,五种数据类型的共同之处是数据都以Key-Value键值对保存,对于习惯了Java的程序员来说,Map的Key和Value可以自定义,value还可...