iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >redis如何通过pipeline提升吞吐量
  • 434
分享到

redis如何通过pipeline提升吞吐量

2024-04-02 19:04:59 434人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关Redis如何通过pipeline提升吞吐量的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。案例目标简单介绍 redis pipeline 的机制,结合一

这篇文章给大家分享的是有关Redis如何通过pipeline提升吞吐量的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

案例目标

简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用。

案例背景

应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元;

然而在某些服务中,数据操作对redis 是强依赖的,在最近的一次分析中发现:

一次数据推送会对 redis 产生近30次读写操作!

在数据推送业务中的性能压测中,以数据上报 -> 下发应答为一次事务;而对于这样的读写模型,redis 的操作过于频繁,很快便导致系统延时过高,吞吐量低下,无法满足目标;

优化过程 主要针对业务代码做的优化,其中redis 操作经过大量合并,最终降低到原来的1/5,而系统吞吐量也提升明显。

其中,redis pipeline(管道机制) 的应用是一个关键手段。

pipeline的解释

Pipeline指的是管道技术,指的是客户端允许将多个请求依次发给服务器,过程中而不需要等待请求的回复,在最后再一并读取结果即可。

管道技术使用广泛,例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。 Redis很早就支持管道(pipeline)技术。(因此无论你运行的是什么版本,你都可以使用管道(pipelining)操作Redis)

普通请求模型

redis如何通过pipeline提升吞吐量

[图-pipeline1]

Pipeline请求模型

redis如何通过pipeline提升吞吐量

[图-pipeline2]

从两个图的对比中可看出,普通的请求模型是同步的,每次请求对应一次io操作等待;

而Pipeline 化之后所有的请求合并为一次IO,除了时延可以降低之外,还能大幅度提升系统吞吐量。

代码实例

说明

本地开启50个线程,每个线程完成1000个key的写入,对比pipeline开启及不开启两种场景下的性能表现。

相关常量

// 并发任务
private static final int taskCount = 50;
// pipeline大小
private static final int batchSize = 10;
// 每个任务处理命令数
private static final int cmdCount = 1000;

private static final boolean usePipeline = true;

初始化连接

JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxActive(200);
poolConfig.setMaxIdle(100);
poolConfig.setMaxWait(2000);
poolConfig.setTestOnBorrow(false);
poolConfig.setTestOnReturn(false);

jedisPool = new JedisPool(poolConfig, host, port);

并发启动任务,统计执行时间

public static void main(String[] args) throws InterruptedException {
  init();

  flushDB();

  long t1 = System.currentTimeMillis();
  ExecutorService executor = Executors.newCachedThreadPool();

  CountDownLatch latch = new CountDownLatch(taskCount);
  for (int i = 0; i < taskCount; i++) {
   executor.submit(new DemoTask(i, latch));
  }

  latch.await();
  executor.shutdownNow();

  long t2 = System.currentTimeMillis();

  System.out.println("execution finish time(s):" + (t2 - t1) / 1000.0);

 }

DemoTask 封装了执行key写入的细节,区分不同场景

 public void run() {
   logger.info("Task[{}] start.", id);
   try {
    if (usePipeline) {
     runWithPipeline();
    } else {
     runWithNonPipeline();
    }
   } finally {
    latch.countDown();
   }

   logger.info("Task[{}] end.", id);
  }

不使用Pipeline的场景比较简单,循环执行set操作

for (int i = 0; i < cmdCount; i++) {
    Jedis jedis = get();
    try {
     jedis.set(key(i), UUID.randomUUID().toString());
    } finally {
     if (jedis != null) {
      jedisPool.returnResource(jedis);
     }
    }
    if (i % batchSize == 0) {
     logger.info("Task[{}] process -- {}", id, i);
    }
   }

使用Pipeline,需要处理分段,如10个作为一批命令执行

for (int i = 0; i < cmdCount;) {
    Jedis jedis = get();

    try {
     Pipeline pipeline = jedis.pipelined();
     int j;
     for (j = 0; j < batchSize; j++) {
      if (i + j < cmdCount) {
       pipeline.set(key(i + j), UUID.randomUUID().toString());
      } else {
       break;
      }
     }
     pipeline.sync();
     logger.info("Task[{}] pipeline -- {}", id, i + j);

     i += j;

    } finally {
     if (jedis != null) {
      jedisPool.returnResource(jedis);
     }
    }

   }

运行结果

不使用Pipeline,整体执行26s;而使用Pipeline优化后的代码,执行时间仅需要3s!

NoPipeline-stat 

redis如何通过pipeline提升吞吐量

Pipeline-stat

redis如何通过pipeline提升吞吐量

注意事项

pipeline机制可以优化吞吐量,但无法提供原子性/事务保障,而这个可以通过Redis-Multi等命令实现。

感谢各位的阅读!关于“redis如何通过pipeline提升吞吐量”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: redis如何通过pipeline提升吞吐量

本文链接: https://www.lsjlt.com/news/57484.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redis如何通过pipeline提升吞吐量
    这篇文章给大家分享的是有关redis如何通过pipeline提升吞吐量的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。案例目标简单介绍 redis pipeline 的机制,结合一...
    99+
    2024-04-02
  • java开发接口吞吐量提升10多倍技巧
    目录背景分析过程定位“慢”原因继续定位“慢”的原因定位CPU使用率高的原因总结TODO背景 公司的一个ToB系统,因为客户使用的也不...
    99+
    2023-01-11
    java提升接口吞吐量 java 吞吐量
  • golang WebSocket性能优化:提升响应速度和吞吐量
    Golang WebSocket性能优化:提升响应速度和吞吐量,需要具体代码示例摘要:WebSocket是一种用于建立客户端和服务器间全双工通信的协议,被广泛应用于实时聊天、数据传输等方面。然而,随着应用规模的增大,WebSocket的性能...
    99+
    2023-12-17
    Golang 性能优化 websocket
  • Flume的吞吐量和性能如何
    Flume是一个开源的分布式日志收集工具,通常用于在大规模数据处理系统中收集、聚合和传输日志数据。它的吞吐量和性能取决于多种因素,例...
    99+
    2024-03-08
    Flume
  • PHP-FPM优化策略:如何提高网站的吞吐量
    引言:在当今互联网时代,网站的吞吐量对于用户体验和业务的成功至关重要。而PHP-FPM作为一种优秀的PHP运行模式,能够有效地提高网站的性能。本文将介绍一些PHP-FPM优化策略,并提供具体的代码示例,帮助读者提高网站的吞吐量。一、使用进程...
    99+
    2023-10-21
    PHP-FPM优化策略:吞吐量提升
  • 如何优化Samza的性能和吞吐量
    要优化Samza的性能和吞吐量,可以采取以下几种方法: 配置合适的资源:确保Samza集群有足够的CPU、内存和存储资源,以及网...
    99+
    2024-04-02
  • 如何优化Oozie的性能和吞吐量
    要优化Oozie的性能和吞吐量,可以采取以下措施: 调整Oozie的配置参数:通过调整Oozie的配置参数,如调整作业执行器(E...
    99+
    2024-04-02
  • Java中的缓存加载算法如何提高系统的吞吐量?
    随着互联网应用的不断发展,对于系统性能的要求越来越高。在大量数据处理中,缓存技术被广泛使用。缓存技术的本质是通过将数据保存在高速缓存中,减少数据的读取时间,从而提高系统的响应速度和吞吐量。本篇文章将重点介绍Java中的缓存加载算法,以及如...
    99+
    2023-09-27
    load 缓存 编程算法
  • 如何优化 Spring 中的同步性能以提高系统吞吐量?
    Spring 是一个非常流行的 Java 开发框架,但是在处理高并发场景下,同步性能成为了一个瓶颈,导致系统吞吐量下降。本文将介绍如何优化 Spring 中的同步性能以提高系统吞吐量。 一、使用无锁集合 在高并发场景下,锁竞争会导致系统性能...
    99+
    2023-09-21
    面试 同步 spring
  • 如何理解MySQL数据库监控指标的吞吐量
    今天就跟大家聊聊有关如何理解MySQL数据库监控指标的吞吐量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。如果你的数据库运行缓慢,或者出于某种原因无...
    99+
    2024-04-02
  • golang redis中Pipeline通道如何使用
    本文小编为大家详细介绍“golang redis中Pipeline通道如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang redis中Pipeline通道如何使用”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-30
  • 如何评估负载均衡器的性能和吞吐量
    评估负载均衡器的性能和吞吐量可以通过以下步骤进行: 压力测试:使用压力测试工具模拟大量用户访问负载均衡器并查看其在不同负载下的性...
    99+
    2024-04-17
    负载均衡
  • Java并发编程:如何实现高吞吐量的文件读写?
    在大型数据处理系统中,文件读写是一个必不可少的环节。然而,传统的文件读写方法在高并发、大数据量的情况下往往存在性能瓶颈,无法满足系统的需求。本文将介绍一种基于Java并发编程的文件读写方案,可以实现高吞吐量的文件读写。 使用NIO实现文...
    99+
    2023-10-17
    并发 响应 文件
  • 如何通过Partition分区提升MySQL性能
    如何通过Partition分区提升MySQL性能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  什么是分区  数据库分区是一...
    99+
    2024-04-02
  • 内容审核的艺术:通过 CMS 提升网站质量
    ...
    99+
    2024-04-02
  • Vue如何通过懒加载提升页面响应速度
    这篇文章将为大家详细讲解有关Vue如何通过懒加载提升页面响应速度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM...
    99+
    2023-06-15
  • PHP8如何通过JIT编译提升Web应用的性能?
    PHP8如何通过JIT编译提升Web应用的性能?随着Web应用的不断发展和需求的增加,提升Web应用的性能成为了开发者关注的焦点之一。PHP作为一种常用的服务器端脚本语言,一直以来都备受开发者喜爱。而PHP8中引入了JIT(即时编译)编译器...
    99+
    2023-10-22
    性能 Web应用 PHP JIT编译
  • 如何通过php函数提升网站的响应速度?
    在如今互联网发展迅猛的时代,网站的响应速度对用户体验和搜索引擎排名都具有重要影响。而PHP作为一种常用的服务器端脚本语言,通过优化PHP函数的使用可以有效地提升网站的响应速度。本文将从几个方面介绍如何通过PHP函数提升网站的响应速度,并给出...
    99+
    2023-10-21
    网站响应速度 PHP函数 提升
  • PHP8如何通过Just-In-Time Compilation提升文件加载速度?
    PHP8如何通过Just-In-Time Compilation提升文件加载速度?随着互联网的发展,网页应用程序的性能要求也越来越高。PHP作为广泛应用于网页开发的编程语言,在性能方面一直备受诟病。然而,随着PHP8的发布,引入了Just-...
    99+
    2023-10-24
    PHP JIT Compilation 文件加载速度
  • 如何通过PHP开发缓存提升网页加载速度
    如何通过PHP开发缓存提升网页加载速度在现今互联网高速发展的时代,网页的加载速度对于用户体验尤为重要。而PHP作为一种流行的服务器端脚本语言,可以通过缓存技术来提高网页的加载速度。本文将介绍如何使用PHP开发缓存来提升网页加载速度,并提供一...
    99+
    2023-11-07
    缓存 开发 PHP
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作