首页 > 数据库 >【赵渝强老师】Redis的管道Pipeline

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

时间:2024-09-02 10:52:33浏览次数:18  
标签:PipeLine Redis Pipeline TCP 管道 赵渝强 客户端


【赵渝强老师】Redis的管道Pipeline_数据库

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

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

  视频讲解如下:

Redis的管道Pipeline


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


  Redis执行的过程如图1所示:

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

  由于网络开销延迟,就算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连接中减少了"交互往返"的时间。


标签:PipeLine,Redis,Pipeline,TCP,管道,赵渝强,客户端
From: https://blog.51cto.com/collen7788/11895904

相关文章

  • PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
    大家好,我是码农先森。我们在某宝或某多多上抢购商品时,如果只是下了订单但没有进行实际的支付,那在订单页面会有一个支付倒计时,要是过了这个时间点那么订单便会自动取消。在这样的业务场景中,一般情况下就会使用到延时队列。通常在客户下单之后,就会将订单数据推送到延时队列中并且......
  • Redis
    Redis数据类型五种基本字符串String列表List集合Set有序集合SortedSet也叫ZSet哈希Hash五种高级消息队列Stream地理空间Geospatial…启动:输入redis-server启动redis客户端:redis-cli操作StringsetNamefyq:添加getName:获取delName:删......
  • Redis集群搭建以及用idea连接集群
    一、redis的集群搭建:判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数,搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。1、安装ruby#1.准备环......
  • Redis基础知识学习笔记(二)
    文章目录一.Redis安装1.Windows下安装1>资源管理器目录进入2>目录进入命令:3.配置环境变量2.Linux下安装1>安装redis2>启动redis3>查看redis是否启动二.Redis配置1.查看配置2.编辑配置3.参数说明三.Redis数据类型1.String(字符串)常用命令实例2.Hash(哈希)......
  • Redis组件介绍(四)
    写在前面今天继续学习后面的知识。Redis操作命令操作List相关APILPUSH说明:将某个值加入到一个key列表的头部。当列表不存在时会创建。语法:LPUSHkeyvalue[value...]返回值:成功返回列表的元素个数,失败返回0。LPUSHX说明:与LPUSH类似,但必须保证......
  • Redis常见问题总结
    Redis常见问题总结参考小林codingRedis常见问题总结Redis集群架构所产生的问题及如何处理Java全栈知识体系Redis集群搭建目录1.认识Redis2.Redis应用场景3.Redis持久化4.Redis设计认识RedisRedis是一种开源的内存数据结构存储工具,用作分布式内存中的键值数据库......
  • Redis String 命令
    常用命令命令作用例子图片setkeyvalue将值存入redis中setname张三getkey获取对应key的值getnameincrkey将key对应value(只适用数字类型)incragedecrkey将key对应的value-1(只使用数字类型)decragesetexkeysecondsvalue......
  • [Redis]Intset
    intset小整数集合set集合容纳的元素都是整数并且元素个数较少时,Redis会使用intset来存储集合元素。intset是紧凑的数组结构,同时支持16位、32位和64位整数structintset<T>{ int32encoding;//决定整数位宽是16位、32位还是64 int32length;//元素个数 i......
  • 常用的 Redis 配置命令
    Redis的配置文件(通常是redis.conf)包含了许多配置选项,可以用来调整Redis服务器的行为。以下是一些常用的Redis配置命令及其详解:bind描述:指定Redis监听的IP地址。示例:bind127.0.0.1解释:只允许从本地机器访问Redis实例。port描述:指定Redis监听的端口......
  • Redis基础知识学习笔记(一)
    文章目录Redis简介Redis简介REmoteDIctionaryServer(Redis)是一个由SalvatoreSanfilippo写的key-value存储系统,是跨平台的非关系型数据库,其是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)......