纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

mushishi   2021-06-22 我要评论
想了解你真的了解redis为什么要提供pipeline功能的相关内容吗mushishi在本文为您仔细讲解redis pipeline的相关知识和一些Code实例欢迎阅读和指正我们先划重点: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


相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式