`

Redis学习笔记7--Redis管道(pipeline)

 
阅读更多
redis的管道(Pipelining)操作是一种异步的访问模式,一次发送多个指令,不同步等待其返回结果。这样可以取得非常好的执行效率。这就是管道,调用方法如下:

@Test
public void test3Pipelined() {
    Jedis jedis = new Jedis("localhost");
    Pipeline pipeline = jedis.pipelined();
    long start = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
        pipeline.set("p" + i, "p" + i);
    }
    List<Object> results = pipeline.syncAndReturnAll();
    long end = System.currentTimeMillis();
    System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
    jedis.disconnect();
}



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必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个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
分享到:
评论

相关推荐

    Redis学习笔记整理

    一、 redis 环境搭建 2 二、 redis学习笔记之...五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31

    redis学习笔记.pdf

    Redis学习笔记 Redis是一个开源的基于键值对(Key-Value)NoSQL数据库,使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API。Redis可以被称为KV数据库,键值对数据库,内部存储...

    Redis学习笔记.rar

    redis学习笔记整理 ...五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31

    redis学习笔记。

    这只是 Redis 学习的基础,深入使用还需要掌握更多的高级特性和最佳实践,例如集群搭建、主从复制、Lua 脚本、Pipeline 使用等。随着对 Redis 的了解加深,你可以将其应用到更复杂的系统设计中,优化性能和提高系统...

    redis基本命令model-for-net开发笔记

    - **管道**:通过发送多条命令一次性处理,提高效率,如 StackExchange.Redis 提供的 `Pipeline` 类。 - **发布订阅**:`PUBLISH channel message` 发布消息,`SUBSCRIBE channel` 订阅消息。 - **持久化**:RDB ...

    redis学习笔记

    Redis 是一个高性能的键值数据库,它以数据结构服务器著称,支持多种数据类型,如字符串、列表、集合、...此外,Redis 还有许多高级特性,如 Lua 脚本、Geo 空间索引和 HyperLogLog 等,可以根据实际需求进一步学习。

    redis个人学习笔记

    Redis 是一个开源的高性能键值对存储服务系统,它基于内存但同时也支持持久化,确保在断电情况下数据不会丢失。Redis 使用C语言编写,采用单线程模型,因此能够达到每秒数十万次的读写操作,这主要得益于其数据存储...

    redis基础学习笔记

    4.pipeline 14 五.测试服务器 16 六.密码验证服务器 16 七.Log 16 八.DB数 17 九. Redis原理 17 1.数据结构 17 2.存储结构和存储格式 19 3.性能 20 4.网络IO模型 20 5.内存管理方面 20 6.数据一致性问题 20 7....

    Redis的学习笔记

    Redis 是一款开源的 NoSQL 数据库,以键值对存储数据,同时也被称作数据结构服务器,因为它提供了丰富的数据类型,如字符串、列表、集合、有序集合和哈希表等。Redis 支持多种原子性操作,如字符串的追加、数值的...

    一份精简的redis入门学习笔记

    Redis 是一款高性能的键值数据库,...在学习 Redis 时,了解其数据类型、操作命令、持久化机制以及复制和发布订阅等功能是至关重要的。通过不断实践和探索,可以深入掌握 Redis 的精髓,并将其有效地应用到实际项目中。

    Redis中级篇学习笔记

    在Redis的中级篇学习中,我们将深入探讨其核心特性、数据类型、持久化机制、集群搭建以及性能优化策略。 1. **核心特性**: - Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set...

    狂神说RedisB站笔记.rar

    6. 管道与批量操作:通过管道(Pipeline)提高客户端与服务器之间的通信效率,批量操作可以减少网络延迟。 7. 发布订阅:如何实现简单的消息传递,以及在聊天室、实时通知等场景中的应用。 8. Lua脚本:利用Lua脚本...

    redis笔记.zip

    在学习Redis时,除了阅读文档和笔记,还可以参考官方文档、社区论坛、在线课程等资源,加深理解和掌握实际操作技能。同时,实践是检验理论的最好方式,可以通过搭建Redis环境,动手操作,解决实际问题来提升技能水平...

    Redis6视频课程配套资料.zip

    笔记.zip包含了学习Redis6.2.1过程中整理的详细笔记,这些笔记涵盖了Redis的基本概念、数据类型(如字符串、哈希、列表、集合、有序集合)、持久化机制(RDB和AOF)、事务、复制、Sentinel哨兵系统、Cluster集群以及...

    redis_learning:为自己重做学习笔记

    本学习笔记旨在深入理解 Redis 的核心概念、特性和使用方法,并结合Java客户端进行实践操作。 一、Redis基本概念 1. 数据类型:Redis 支持五种主要的数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)...

    jedis使用指南

    具体事务和监听请参考文章:redis学习笔记之事务 暂时找到三种实现方式: 1. 通过jedis.setnx(key,value)实现 import java.util.Random; import org.apache.commons.pool.impl.GenericObjectPool.Config; import ...

Global site tag (gtag.js) - Google Analytics