当前位置: 首页 > article >正文

【赵渝强老师】Redis的管道Pipeline

在这里插入图片描述

  Redis使用的是客户端-服务器(C-S)模型和请求/响应协议的TCP服务器。这意味着通常情况下一个请求会遵循以下步骤:

  • 第一步:客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
  • 第二步:服务端处理命令,并将结果返回给客户端。

  视频讲解如下:

Redis的管道Pipeline

【赵渝强老师】Redis的管道Pipeline

  Redis执行的过程如图1所示:
在这里插入图片描述

  由于网络开销延迟,就算Redis Server端有很强的处理能力,也会由于收到的客户端消息少,而造成吞吐量小。管道PipeLine可以一次性发送多条命令并在执行完后一次性将结果返回。管道PipeLine通过减少客户端与Redis服务器端的通信次数来实现降低往返延时时间,而且管道PipeLine 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。管道PipeLine的工作过程如图2所示。
  图2中的客户端可以将三个命令放到一个TCP报文一起发送;而Redis服务器端则可以将三条命令的处理结果放到一个TCP报文返回。下面通过Java代码来测试普通的Redis操作和Redis PipeLine操作在性能上的差别。

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
public class TestRedisPipeLine {
    @Test
    public void testNormalCommand() {
        Jedis client = new Jedis("192.168.79.11", 6379);
        long start = System.currentTimeMillis();
        for(int i=0;i<10000;i++) {
            client.set("key" + i, "value"+i);
        }

        long end = System.currentTimeMillis();
        client.close();
        System.out.println("使用普通命令插入1万条数据的执行时间为:"+ (end - start));
    }

    @Test
    public void testPipeLineCommand() {
            Jedis client = new Jedis("192.168.79.11", 6379);
            Pipeline pl = client.pipelined();
            long start = System.currentTimeMillis();
            for(int i=0;i<10000;i++) {
             pl.set("key" + i, "value"+i);
            }
            pl.sync();
            long end = System.currentTimeMillis();
            client.close();
            System.out.println("使用管道命令插入1万条数据的执行时间为:"+ (end - start));
        }
}

  视频讲解如下:

使用Redis的管道Pipeline

【赵渝强老师】使用Redis的管道Pipeline

  分别运行testNormalCommand()和testPipeLineCommand()方法输出的结果如下:

  • 使用普通命令插入1万条数据的执行时间为:1147
  • 使用管道命令插入1万条数据的执行时间为:92

提示:管道PipeLine在某些场景下非常有用,比如有多个命令需要被"及时的"提交,而且他们对相应结果没有互相依赖,对结果响应也无需立即获得,那么管道PipeLine就可以充当这种"批处理"的工具;而且在一定程度上,可以较大的提升性能,性能提升的原因主要是TCP连接中减少了"交互往返"的时间。


http://www.kler.cn/a/283327.html

相关文章:

  • 【IC每日一题:IC常用模块--RR/handshake/gray2bin】
  • 网络技术-定义配置ACL规则的语法和命令
  • Java算法OJ(7)随机快速排序
  • 蓝桥杯c++算法学习【2】之搜索与查找(九宫格、穿越雷区、迷宫与陷阱、扫地机器人:::非常典型的必刷例题!!!)
  • 算法——长度最小的子数组(leetcode209)
  • SpringMVC学习笔记(二)
  • 【Linux】用户和用户组管理(第四篇)
  • 山东省大数据职称考试(2)
  • K13021 - 小科坐地铁
  • GAN:数据生成的魔术师
  • 查看 linux 系统信息
  • MySQL——多表操作(四)(2)带 EXISTS 关键字的子查询
  • ruoyi-app前端在缓存中添加nick_name和user_id属性值
  • windows安装macos虚拟机
  • apisix 本地开发环境部署
  • iOS/iPadOS18.1Beta3发布,新增通知摘要和AI消除功能
  • 如何在CenOS7上安装docker
  • PostgreSQL:后端开发者的瑞士军刀
  • 给自己复盘用的tjxt笔记day12第一部分
  • 【原型设计工具评测】Axure、Figma、Sketch三强争霸
  • 关于stm32的硬件CRC32与U盘分区中的CRC32计算方式不同的探索;stm32的硬件CRC32的使用细节;stm32的硬件CRC32的问题;
  • gin 通过 OpenTelemetry 实现链路追踪
  • 上新!Matlab实现基于QRGRU-Attention分位数回归门控循环单元注意力机制的时间序列区间预测模型
  • 数学基础 -- 线性代数之增广矩阵
  • Redis缓存穿透、缓存击穿与缓存雪崩的详细讲解和案例示范
  • 【WiFi协议的发展学习1】