`
jzkangta
  • 浏览: 160972 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

五 redis学习笔记之pipeline(转)

    博客分类:
  • JAVA
 
阅读更多
原文地址:http://www.cnblogs.com/xhan/archive/2011/02/05/1949276.html

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必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打 包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个jredis客户端使用pipeline的测试
package jredisStudy;
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 PipeLineTest {
    public static void main(String[] args) {
          long start = System.currentTimeMillis();
          usePipeline();
          long end = System.currentTimeMillis();
          System.out.println(end-start);

          start =  System.currentTimeMillis();
          withoutPipeline();
          end  = System.currentTimeMillis();
          System.out.println(end-start);

    }
  
    private static void withoutPipeline()
    {
         try {
             JRedis  jredis = new JRedisClient("192.168.56.55",6379);
                for(int i =0 ; i < 100000 ; i++)
                {
                    jredis.incr("test2");
                }
                jredis.quit();
        } catch (Exception e) {
        }
    }

    private static void usePipeline() {
        try {
            ConnectionSpec spec = DefaultConnectionSpec.newSpec("192.168.56.55", 6379, 0, null);
            JRedis jredis = new JRedisPipelineService(spec);
            for(int i =0 ; i < 100000 ; i++)
            {
                jredis.incr("test2");
            }
            jredis.quit();
        } catch (Exception e) {
        }
    }
}
输出
103408 //使用了pipeline
104598 //没有使用

测试结果不是很明显,这应该是跟我的测试环境有关。我是在自己win连接虚拟机的linux。网络延迟比较小。所以pipeline
优势不明显。如果网络延迟小的话,最好还是不用pipeline。除了增加复杂外,带来的性能提升不明显。
分享到:
评论

相关推荐

    Redis学习笔记整理

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

    Redis学习笔记.rar

    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学习笔记。

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

    redis学习笔记

    **五、Redis Pipeline** Pipeline 技术允许一次性发送多个命令到服务器,减少了网络延迟,提高了处理效率。 **六、Redis 发布订阅** 发布订阅功能允许客户端订阅特定的频道,当有消息发布到该频道时,所有订阅者...

    redis基础学习笔记

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

    redis个人学习笔记

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

    Redis的学习笔记

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

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

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

    Redis中级篇学习笔记

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

    redis笔记.zip

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

    狂神说RedisB站笔记.rar

    《狂神说Redis》是一份深入讲解Redis数据库的教程,主要源自B站上的一系列视频课程。Redis,全称为Remote Dictionary Server,是一...通过视频和配套的PDF笔记,你可以更深入地学习和掌握这个强大的内存数据存储系统。

    Redis6视频课程配套资料.zip

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

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

    本笔记主要探讨 Redis 的基本命令,帮助 .NET 开发者更好地理解和使用 Redis。 1. **安装与启动** Redis 可在多种操作系统上运行,包括 Windows 和 Linux。在 Linux 上通常通过源码编译安装,Windows 用户可以下载...

    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