你真的了解redis为什么要提供pipeline功能

 更新时间:2021年06月22日 08:18:28   作者:mushishi  
Redis本身是一个cs模式的tcp server, client可以通过一个socket连续发起多个请求命令。这篇文章带领大家学习redis为什么要提供pipeline功能,需要的朋友可以参考下

 Redis本身是一个cs模式的tcp server, client可以通过一个socket连续发起多个请求命令。 每个请求命令发出后client通常会阻塞并等待redis服务端处理,redis服务端处理完后将结果返回给client。

       redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。 由于网络开销延迟,即算redis server端有很强的处理能力,也由于收到的client消息少,而造成吞吐量小。当client 使用pipelining 发送命令时,redis server必须部分请求放到队列中(使用内存)执行完毕后一次性发送结果;如果发送的命名很多的话,建议对返回的结果加标签,当然这也会增加使用的内存;

       Pipeline在某些场景下非常有用,比如有多个command需要被“及时的”提交,而且他们对相应结果没有互相依赖,而且对结果响应也无需立即获得,那么pipeline就可以充当这种“批处理”的工具;而且在一定程度上,可以较大的提升性能,性能提升的原因主要是TCP链接中较少了“交互往返”的时间。不过在编码时请注意,pipeline期间将“独占”链接,此期间将不能进行非“管道”类型的其他操作,直到pipeline关闭;如果你的pipeline的指令集很庞大,为了不干扰链接中的其他操作,你可以为pipeline操作新建Client链接,让pipeline和其他正常操作分离在2个client中。不过pipeline事实上所能容忍的操作个数,和socket-output缓冲区大小/返回结果的数据尺寸都有很大的关系;同时也意味着每个redis-server同时所能支撑的pipeline链接的个数,也是有限的,这将受限于server的物理内存或网络接口的缓冲能力。

下面给大家普及redis为什么要提供pipeline功能。

通常我们用redis做接口缓存后,查询接口的性能就能提升到ms级别;
但是redis是纯内存操作啊,总不至于要到ms吧,根据官方的 benchmark 单实例也是能抗 7w+ qps 也就是说单个redis 操作在redis-server上耗时大概是 0.014ms,那时间是消耗到哪里去了?

redis是 client-server 模型,client客户端将 command 通过tcp网络连接发送到 server服务端,服务端执行完 command 后将响应再通过 tcp 连接发送给client;

对于应用服务来说,我们所关注的性能其实是客户端时间,即前面的整个执行过程,虽然 redis-server 命令执行的非常快,但每次命令执行都需要在网络上走一遭,按照我们公司redis客户端中间件统计的rt,一次命令的执行平均是1ms 左右,那么网络耗时占比: 1-0.014 / 1 = 0.98(98%!!! ) 可见,大部分时间都耗在网络io上

所以,减少网络io次数就能大大提供 redis-client 所感知的耗时,提升应用服务性能,redis提供的 pipeline 功能,让我们可以提交一个命令后,不用等这个返回结果就可以继续执行下一个命令,也就是说,可以执行多个命令后,一次性获取所有结果; 这样就大大减少了在网络上的消耗

比如

Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X

Server: 1
Server: 2
Server: 3
Server: 4

除此之外,减少了网络读写次数的同时,也减少了 redis-server 内核态和用户态的上下文切换,进一步提高了性能

性能提升了多少?

redis官方声称pipeline可带来10倍的性能提升

测试机Intel(R) Xeon(R) CPU E5520 @ 2.27GHz, 用pipeline比没用pipeline性能提升了将近7倍

// 用pipeline
$ ./redis-benchmark -r 1000000 -n 2000000 -t get,set,lpush,lpop -P 16 -q
SET: 552028.75 requests per second
GET: 707463.75 requests per second
LPUSH: 767459.75 requests per second
LPOP: 770119.38 requests per second

// 没用pipeline
SET: 122556.53 requests per second
GET: 123601.76 requests per second
LPUSH: 136752.14 requests per second
LPOP: 132424.03 requests per second

注意,使用pipeline的时候,多个命令的响应是缓存在server端的,所以在 pipeline 里一批命令的数量不要过多,以免服务端内存压力过大

其实,减少网络io次数的处理技巧还是比较常见的,如

  • CSS Sprites,将很多小图标合并成一张图片
  • jdbc batch api批量提交sql

参考:

https://redis.io/topics/pipelining

https://redis.io/topics/benchmarks

以上就是redis为什么要提供pipeline功能的详细内容,更多关于redis pipeline的资料请关注脚本之家其它相关文章!

相关文章

  • Redis实现库存扣减的解决方案防止商品超卖

    Redis实现库存扣减的解决方案防止商品超卖

    在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等,基于redis实现扣减库存的具体实现,初始化库存回调函数(IStockCallback)扣减库存服务(StockService),感兴趣的朋友跟随小编一起看看吧
    2022-06-06
  • 使用Redis缓存时高效的批量删除的几种方案

    使用Redis缓存时高效的批量删除的几种方案

    这篇文章主要介绍了使用Redis缓存时高效的批量删除的几种方案的相关资料,需要的朋友可以参考下
    2023-01-01
  • Redis+Caffeine实现多级缓存的步骤

    Redis+Caffeine实现多级缓存的步骤

    随着不断的发展,这一架构也产生了改进,在一些场景下可能单纯使用Redis类的远程缓存已经不够了,还需要进一步配合本地缓存使用,例如Guava cache或Caffeine,从而再次提升程序的响应速度与服务性能,这篇文章主要介绍了Redis+Caffeine实现多级缓存,需要的朋友可以参考下
    2024-01-01
  • 深度解析Redis 数据淘汰策略

    深度解析Redis 数据淘汰策略

    本文将深入剖析8种淘汰策略的机制,并结合Java代码演示生产环境的最佳实践,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • 使用Redis实现分布式锁的方法

    使用Redis实现分布式锁的方法

    为了保证我们线上服务的并发性和安全性,目前我们的服务一般抛弃了单体应用,采用的都是扩展性很强的分布式架构,这篇文章主要介绍了使用Redis实现分布式锁的方法,需要的朋友可以参考下
    2022-06-06
  • Redis RDB技术底层原理详解

    Redis RDB技术底层原理详解

    为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中以某种形式同步到硬盘中,这一过程就是持久化,本文重点给大家介绍Redis RDB技术底层原理实现方法,一起看看吧
    2021-09-09
  • Redis序列化设置以及jetcache连接Redis序列化的设置过程

    Redis序列化设置以及jetcache连接Redis序列化的设置过程

    这篇文章主要介绍了Redis序列化设置以及jetcache连接Redis序列化的设置过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Redis服务器的启动过程分析

    Redis服务器的启动过程分析

    这篇文章主要介绍了Redis服务器的启动过程分析,本文讲解了初始化Redis服务器全局配置、加载配置文件、初始化服务器、加载数据、开始网络监听等内容,需要的朋友可以参考下
    2015-04-04
  • Centos7.3安装Redis4.0.6详细图文教程

    Centos7.3安装Redis4.0.6详细图文教程

    这篇文章主要介绍了Centos7.3安装Redis4.0.6详细教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • Redis类型type与编码encoding原理及使用示例

    Redis类型type与编码encoding原理及使用示例

    这篇文章主要为大家介绍了Redis类型type与编码encoding原理及使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论