Redis管道--Pipeline

小鱼儿 2022-05-22 00:19 449阅读 0赞

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

概念

Redis客户端执行一条命令分为如下四个过程:

  1. 发送命令
  2. 命令排队
  3. 命令执行
  4. 返回结果
    其中第一个和第四个称为执行一条命令的往返时间,Round Trip Time(RTT).
    Pipeline指管道技术,客户端允许将多个请求一次发送给服务器,过程中不需要等待请求的回复,服务端将结果都查回后,一次返回给客户端,通过这种方式能够提高吞吐量

对比分析

Redis提供了批量操作命令,如mget,mset,但有些命令不支持批量操作,如果有一个场景需要批量操作某些key,加入有1000个

  1. (我们将使用批量和不使用批量操作时的排队时间忽略)在我们没有使用批量操作时所需要的时间是
    1000次RTT时间+1000次命令执行时间
    这里写图片描述
    2.使用pipeline操作一次传递命令时,所需要的时间是:
    1次RTT时间+1000次命令执行时间
    这里写图片描述

举例分析

测试不使用pipeline和使用pipeline分别向redis中存放一千条

  1. public class PipeLineDemo {
  2. public static void main(String[] args) {
  3. testUnUsed();
  4. testUsed();
  5. }
  6. //没使用pipeline
  7. public static void testUnUsed(){
  8. long currentTimeMillis = System.currentTimeMillis();
  9. Jedis jedis = new Jedis("192.168.20.188", 6379);
  10. for (int i = 0; i < 1000; i++) {
  11. jedis.set("aaaa" + i, "aaaa" + i);
  12. }
  13. long endTimeMillis = System.currentTimeMillis();
  14. System.out.println("unused "+(endTimeMillis - currentTimeMillis));
  15. }
  16. //使用pipeline
  17. public static void testUsed(){
  18. long currentTimeMillis = System.currentTimeMillis();
  19. Jedis jedis = new Jedis("192.168.20.188", 6379);
  20. Pipeline pipelined = jedis.pipelined();
  21. for (int i = 0; i < 1000; i++) {
  22. pipelined.set("bbbb" + i, i + "bbbb");
  23. }
  24. pipelined.sync();
  25. long endTimeMillis = System.currentTimeMillis();
  26. System.out.println("used "+ (endTimeMillis - currentTimeMillis));
  27. }
  28. }

执行结果如下:

  1. unused 879
  2. used 51

结果显示,使用了pipeline后提升了将近17呗,效果非常明显。

保证事务

pipeline是一种批量操作,如何保证其事务?在这里需要声明redis的事务是不支持回滚的。它能保证的是这次的命令都不执行。pipeline期间是独占链接的,在pipeline开启,并未关闭 的情况下,执行其他非pipeline命令将会报异常,这一点也许要注意。事务的使用如下代码:

  1. //使用pipeline
  2. public static void testUsed(){
  3. long currentTimeMillis = System.currentTimeMillis();
  4. Jedis jedis = new Jedis("192.168.20.188", 6379);
  5. Pipeline pipelined = jedis.pipelined();
  6. //开启事务
  7. pipelined.multi();
  8. for (int i = 0; i < 1000; i++) {
  9. pipelined.set("bbbb" + i, i + "bbbb");
  10. }
  11. //提交事务
  12. pipelined.exec();
  13. //关闭pipeline
  14. pipelined.sync();
  15. long endTimeMillis = System.currentTimeMillis();
  16. System.out.println("used"+ (endTimeMillis - currentTimeMillis));
  17. }

总结

使用pipeline时性能提升非常明显,根据项目需求,合理的使用pipeline,提升性能。

发表评论

表情:
评论列表 (有 0 条评论,449人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis 管道Pipelining

    > 一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。 > > 这就是管道(pipe

    相关 Redis 管道技术——Pipeline

    管道技术(Pipeline)是客户端提供的一种批处理技术,用于一次处理多个 Redis 命令,从而提高整个交互的性能。 通常情况下 Redis 是单行执行的,客户端先向服务器

    相关 RedisPipeline管道

    一、管道 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤: > 客户端向服务端发送一个查询请求,并监听S

    相关 Redis 管道pipeline

    Redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通