Redis(十七):批量操作Pipeline

大多数情况下,我们都会通过请求-相应机制去操作redis。只用这种模式的一般的步骤是,先获得jedis实例,然后通过jedis的get/put方法与redis交互。由于redis是单线程的,下一次请求必须等待上一次请求执行完成后才能继续执行。然而使用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

public class PiplineTest {

    private static int count = 10000;

    public static void main(String[] args){

        useNormal();

        usePipeline();

    }

    public static void usePipeline(){

        ShardedJedis jedis = getShardedJedis();

        ShardedJedisPipeline pipeline = jedis.pipelined();

        long begin = System.currentTimeMillis();

        for(int i = 0;i<count;i++){

            pipeline.set("key_"+i,"value_"+i);

        }

        pipeline.sync();

        jedis.close();

        System.out.println("usePipeline total time:" + (System.currentTimeMillis() - begin));

    }

    public static void useNormal(){

        ShardedJedis jedis = getShardedJedis();

        long begin = System.currentTimeMillis();

        for(int i = 0;i<count;i++){

            jedis.set("key_"+i,"value_"+i);

        }

        jedis.close();

        System.out.println("useNormal total time:" + (System.currentTimeMillis() - begin));

    }

    public static ShardedJedis getShardedJedis(){

        JedisPoolConfig poolConfig = new JedisPoolConfig();

        poolConfig.setMaxTotal(2);

        poolConfig.setMaxIdle(1);

        poolConfig.setMaxWaitMillis(2000);

        poolConfig.setTestOnBorrow(false);

        poolConfig.setTestOnReturn(false);

        JedisShardInfo info1 = new JedisShardInfo("127.0.0.1",6379);

        JedisShardInfo info2 = new JedisShardInfo("127.0.0.1",6379);

        ShardedJedisPool pool = new ShardedJedisPool(poolConfig, Arrays.asList(info1,info2));

        return pool.getResource();

    }

}

输出结果:


1

2

useNormal total time:772

usePipeline total time:112

从测试的结果可以看出,使用pipeline的效率要远高于普通的访问方式。

那么问题来了,在什么样的情景下适合使用pipeline呢?

有些系统可能对可靠性要求很高,每次操作都需要立马知道这次操作是否成功,是否数据已经写进redis了,那这种场景就不适合。

还有的系统,可能是批量的将数据写入redis,允许一定比例的写入失败,那么这种场景就可以使用了,比如10000条一下进入redis,可能失败了2条无所谓,后期有补偿机制就行了,比如短信群发这种场景,如果一下群发10000条,按照第一种模式去实现,那这个请求过来,要很久才能给客户端响应,这个延迟就太长了,如果客户端请求设置了超时时间5秒,那肯定就抛出异常了,而且本身群发短信要求实时性也没那么高,这时候用pipeline最好了。

原文地址:https://www.cnblogs.com/telwanggs/p/12212788.html

时间: 2024-07-31 07:10:42

Redis(十七):批量操作Pipeline的相关文章

redis学习笔记 - Pipeline与事务

原文 Redis提供了5种数据结构,但除此之外,Redis还提供了注入慢查询分析,Redis Shell.Pipeline.事务.与Lua脚本.Bitmaps.HyperLogLog.PubSub.GEO等附加功能,这些功能可以在某些场景发挥很重要的作用. Pipeline 1. Pipeline概念 Redis客户端执行一条命令分为以下四个步骤: 1.发送命令2.命令排队3.命令执行4.返回结果 其中,第一步+第四步称为Round Trip Time(RTT,往返时间). Redis提供了批量

redis之管道——pipeline

redis 是 CS 模式,Redis客户端与Redis之间使用TCP协议进行连接,一个客户端可以通过一个socket连接发起多个请求命令,每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client,因此当执行多条命令的时候都需要等待上一条命令执行完毕才能执行.如果一次性批量数据单次操作,会有网络延迟.而redis也是单线程的. 而Pipelining可以满足批量的操作,把多个命令连续的发送给Redis Server,然后

redis管道(pipeline)

redis pipeline redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常 会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client.基本的通信过程如下: (Client)127.0.0.1:6379> incr x (Server)(integer) 1 (Client)127.0.0.1:6379> incr x (

redis使用管道pipeline提升批量操作性能(php演示)

Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户端. 如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,有redis服务器依次执行,并返回结果, 为了解决此类问题,设计者设计出了redis管道命令: 客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复,从而大大增加了协议性能 做了测试,使用pipeline

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

Java实现Redis pipeline比较

开始实验这个,是因为Redis实战.pdf上面有例子. 上面用的是 org.jredis包,可是发现这个包不在maven的公共仓库里.需要先下载然后放在本地,导入maven依赖.详见: http://blog.csdn.net/zhu_tianwei/article/details/44900955 https://github.com/alphazero/jredis 在Redis实战.pdf上也有例子. 而Maven公共仓库提供的是jedis包.网上也有例子: http://www.tuic

Java使用Pipeline对Redis批量读写(hmset&amp;hgetall)

一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client.这有点类似于HBase的Scan,通常是Client端获取每一条记录都是一次RPC调用服务端.在Redis中,有没有类似HBase Scanner Caching的东西呢,一次请求,返回多条记录呢?有,这就是Pipline.官方介绍 http://redis.io/topics/pipelining 通过pipeline方式当有大批

Java使用Pipeline对Redis批量读写(hmset&hgetall)

一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client. 这有点类似于HBase的Scan,通常是Client端获取每一条记录都是一次RPC调用服务端. 在Redis中,有没有类似HBase Scanner Caching的东西呢,一次请求,返回多条记录呢? 有,这就是Pipline.官方介绍 http://redis.io/topics/pipelining 通过pipeline方式当

Redis学习笔记2-redis管道(pipeline)

redis的管道(Pipelining)操作是一种异步的访问模式,一次发送多个指令,不同步等待其返回结果.这样可以取得非常好的执行效率.这就是管道,调用方法如下: 来源:http://blog.csdn.net/freebird_lb/article/details/7778919 redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis服务处理,red