点击上方蓝字每天学习数据库

首先来介绍一下今天的主角——Redis Pipelining。该功能是为了解决因为客户端和服务器的网络延迟造成的请求延迟。

Redis Pipelining在很早就出现了,如果你在用较早版本的Redis,那么也能使用这个功能。此功能可以将一系列请求连续发送到Server端,不必等待Server端的返回,而Server端会将请求放进一个有序的管道中,在执行完成后,会一次性将返回值再发送回来。

对于这么神奇的功能,我们怎么能不测一下pipeline对于性能的提升有多大呢?

一、pipeline有多神奇

**测试方法:**对redis分别用顺序写入和pipeline 的方法写入一个微秒级的时间戳,一共写1W个数据,去看这1W 条数据的执行时间。

**测试结果:**pipeline写入与顺序写入的所消耗的时间对比。

**分析:**pipeline和顺序写入最大的区别就是在于pipeline的打包发送数据,网络开销要小很多。在下面的测试中,values很小(20+Byte),而且网络开销也不算大(同乐访问坪山),访问命令也不重(set),但是执行的效率却是天差地别,**顺序写入的执行时间是pipeline的16.8倍!**而在现网环境下,随着网络开销的增大,values值的增大,重命令的增加,这个比例将变得更加恐怖。

1、pipeline写入10000个数据(values = 微秒+时间戳),共用时450ms

2、redis->set()顺序写入,(values = 微秒+时间戳),共用时:7.56s

二、对于pipeline读延时问题的优化

腾讯天天快报业务在使用Redis方面非常专业,在批量导入数据的时候就是使用了pipeline,使得数据能够快速的导入。但是在运营过程中我们发现,pipeline一次打包大量的写入的命令阻塞了同proxy的其他业务的读命令,使得其他业务的读命令延时升高。这个时候就不得不想办法优化这个问题。

首先贴出结论:

建议在pipeline写入的时候,参照“打小包,短sleep的”策略写入。这样能够避免pipeline写入时,由于阻塞造成的读延时问题。

测试开始:

 1、 vaule=1K  sleep=20ms pipeline_num=10000 get_qps=1500

get命令的平均延时在0.1ms,max到18ms,说明redis在pipeline程序sleep的着20ms中,快速的执行了堆积的get命令。如果把sleep值调小会是什么情况呢?

2、get/set 测试:vaule=1K  sleep=0ms pipeline_num=10000 get_qps=1500

在pipeline打包的时间内,get指令就已经执行完了,所以我们可以看到,set的平均延时很长,达到了9ms,已经影响到了写入,所以,我们要调小每次打包的数据量。

4、get/set 测试:vaule=1K  sleep=0ms pipeline_num=1000 get_qps=1500

当把每次的打包量调到1000个命令的时候,就可以明显的看出在写入性能上的优化,写入的平均时间从9ms下降到了0.8ms。

5、get/set 测试:vaule=1K  sleep=0ms pipeline_num=1000 get_qps=6000

为了测试的全面考虑,我们增大了读命令的qps,读命令和写命令都仅有一点点的延时升高,这个是可以接受的。

所以在使用pipeline的时候,参照“打小包,短sleep的”策略,是一个可以选择的方式。

三、测试总结

get set 命令

在get_qps = 6000的时候,pipeline一次打包1000个set命令,每个val大小1K,sleep=0 得到的读写速度都不错,在不算网络开销的情况下,get速度在0.1ms  ,set 速度在1ms。

往期推荐

《云Redis VS 自建Redis》

免费试用

包括云数据库MySQL在内的40+款热门云产品,实名认证的企业用户可免费试用!1000M内存50G数据盘的MySQL可免费体验30天,点击左下角“阅读原文”立即领取~

↓↓点“阅读原文”免费试用

好文和朋友一起看!

var first_sceen__time = (+new Date());if ("" == 1 && document.getElementById('js_content')) { document.getElementById('js_content').addEventListener("selectstart",function(e){ e.preventDefault(); }); } (function(){ if (navigator.userAgent.indexOf("WindowsWechat") != -1){ var link = document.createElement('link'); var head = document.getElementsByTagName('head')[0]; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = "//res.wx.qq.com/mmbizwap/zh_CN/htmledition/style/page/appmsg_new/winwx45ba31.css"; head.appendChild(link); } })();

[图片]

张松坡

赞赏

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

阅读原文

阅读

分享 在看

已同步到看一看

取消 发送

我知道了

朋友会在“发现-看一看”看到你“在看”的内容

确定

已同步到看一看写下你的想法

最多200字,当前共字 发送

已发送

朋友将在看一看看到

确定

写下你的想法...

取消

发布到看一看

确定

最多200字,当前共字

发送中

[图片]

微信扫一扫 关注该公众号

[图片]

微信扫一扫 使用小程序

即将打开""小程序

[取消](javascript:void(0%29;) [打开](javascript:void(0%29;)

文章来源于腾讯云开发者社区,点击查看原文