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


本上四个命令需要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的测试


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

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。除了增加复杂外,带来的性能提升不明显。

时间: 2024-08-05 00:41:35

Redis资料汇总(五) redis pipeline的相关文章

Redis资料汇总专题(转)

原文:Redis资料汇总专题 很多朋友反映,说NoSQLFan上的资料不少,但是要找到自己实用的太难,于是萌生做这样一个专题的想法.通过将不同NoSQL产品从入门到精通的各种资料进行汇总,希望能够让大家更快的找到适合自己的教程或文章进行阅读. 最后更新时间:2013-04-22 1.Redis是什么? 十五分钟介绍 Redis数据结构 Redis系统性介绍 一个很棒的Redis介绍PPT 强烈推荐!非同一般的Redis介绍 Redis之七种武器 锋利的Redis redis 适用场景与实现 [翻

redis资料汇总

redis资源比较零散,引用nosqlfan上的文章,方便大家需要时翻阅.大家看完所有的,如果整理出文章的,麻烦知会一下,方便学习. 1.Redis是什么? 十五分钟介绍 Redis数据结构 Redis系统性介绍 一个很棒的Redis介绍PPT 强烈推荐!非同一般的Redis介绍 Redis之七种武器 锋利的Redis redis 适用场景与实现 [翻译]Redis协议 2.Redis内部实现 Redis源码分析系列文章 Redis运行流程源码解析 Redis 2.6 Lua 脚本功能实现分析

Redis资料汇总(九) 虚拟内存

首先说明下redis的虚拟内存与os的虚拟内存不是一码事,但是思路和目的都是相同的.就是暂时把不经常访问的 数据从内存交换到磁盘中,从而腾出 宝贵的 内存空间用于其他需要访问的数据.尤其是对于redis这样的内存数据库,内存总是不够用的.除了可以将数据分割到多个redis server外.另外的能够提高数据库容量的办法就是使用vm把那些不经常访问的数据交换的磁盘上.如果我们的存储的数据总是有少部分数据被经常访问,大 部分数据很少被访问,对于网站来说确实总是只有少量用户经常活跃.当少量数据被经常访

Redis资料汇总(四) 事务

edis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的 命令. 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的.一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中.当从此连接受到exec命令后,redis会顺序的执行

Redis资料汇总(三) 排序

(1)sort key 这个是最简单的情况,没有任何选项就是简单的对集合自身元素排序并返回排序结果.下面给个例子 redis> lpush ml 12 (integer) 1 redis> lpush ml 11 (integer) 2 redis> lpush ml 23 (integer) 3 redis> lpush ml 13 (integer) 4 redis> sort ml 1. "11" 2. "12" 3. "

Redis资料汇总(二) 数据类型

1. keys redis本质上一个key-value db,所以我们首先来看看他的key.首先key也是字符串类型,但是key中不能包括边界字符 由于key不是binary safe的字符串,所以像"my key"和"mykey\n"这样包含空格和换行的key是不允许的 顺便说一下在redis内部并不限制使用binary字符,这是redis协议限制的."\r\n"在协议格式中会作为特殊字符. redis 1.2以后的协议中部分命令已经开始使用新

[转载] Redis资料汇总专题

转载自http://www.cnblogs.com/tommyli/archive/2011/12/14/2287614.html 1.Redis是什么? 十五分钟介绍 Redis数据结构 Redis系统性介绍 一个很棒的Redis介绍PPT 强烈推荐!非同一般的Redis介绍 Redis之七种武器 锋利的Redis redis 适用场景与实现 2.Redis内部实现 Redis源码分析系列文章 深入Redis内部-Redis 源码讲解 redis源码分析-如何rehash Redis源码分析-

Redis资料汇总(八) 主从复制

redis主从复制配置和使用都非常简单.通过主从复制可以允许多个slave server拥有和master server相同的数据库副本.下面是关于redis主从复制的一些特点 1.master可以有多个slave 2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构 3.主从复制不会阻塞master.也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求.相反slave在初次同步数据时则会阻塞不能

Redis资料汇总(十) java client

redis主页上列出的java 客户端有JDBC-Redis JRedis Jedis三种,下面分别介绍三种客户端的优缺点及其他相关的工具. 支持redis版本 性能 维护 推荐 JDBC-Redis   not good     JRedis 1.2.n release 2.0.0 尚未release版本 fast     Jedis 2.0.0 release fast actively developed 推荐 JDBC-Redis JDBC-Redis is just a JDBC wr