ICode9

精准搜索请尝试: 精确搜索
首页 > 互联网> 文章详细

记一次node上的redis调用优化 | zjutkz's blog

2018-11-16 16:13:45  阅读:598  来源: 互联网

标签:


最近负责的node项目在高并发的情况下性能表现非常的差,rt基本会在7 80ms甚至100ms以上,由于对外提供了dubbo接口,所以经常导致上游应用和自己的dubbo线程池耗尽,所以花了一点时间排查了一番,才发现原来自己的node功力还有很长的路要走啊~之后node的文章可能会越来越多~

先来看看我最早是怎么用的呢:

1
2
3
4
for(let i = 0; i < params.length; i  ) {
redisKey = getKey(params.id);
let value = await redis.exec('get', redisKey);
}

这就是我最原始的调用方法,就是在for循环里不断的去await结果的请求,这样的结果就是每一个请求都需要等待上一个请求完成再去执行,只要在高流量的时候有一部分请求rt很高,就会引起雪崩的反应。

经过了一阵谷歌之后,我发现可以通过Promise.all的形式来进行请求链路的优化:

1
2
3
4
5
for(let i = 0; i < params.length; i  ) {
redisKey = getKey(params.id);
arr.push(redis.exec('get', redisKey))
}
await Promise.all(arr);

上面的第一种方式被我司的node大神严重吐槽了10分钟,然后告诉我,使用Promise.all的方式可以很有效的优化这种连续的网络请求,我赶紧将代码改完并上线。

自信满满的上线之后,迎来的确实现实无情的打击,在高流量的时刻,报警依然不断,我一边和领导说“没事,我再看看”,心里一边想着辞职报告该怎么写。

在继续经过了一系列的谷歌之后,我才发现原来的是对redis的理解太浅了,针对于业务上的需求,我不假思索的只知道使用最简单的set和get,而redis对于set和get这样的命令是一条命令一个tcp请求,在业务场景上确实不太合理,于是我使用谷歌告诉我的pipeline机制去改造现有的get请求:

1
2
3
4
5
let batch = await RedisClient.getClient().batch();
for(let i = 0; i < params.length; i ) {
batch.get(redisKey);
}
batch.exec();

对于pipeline机制大家可以看这篇文章。在使用pipeline之后,便秘一下就通畅了,再也没有报警过,终于可以不用辞职了。

再后面的日子里,我觉得认真的研究一下redis这个东西,保证让上面的问题不再发生,于是我发现其实还是有一种更加简单的方案的,那就是使用mget:

1
2
3
4
5
for(let i = 0; i < params.length; i  ) {
redisKey = getKey(params.id);
arr.push(redisKey);
}
let value = await redis.exec('mget', arr);

使用mget进行批量的查询,这是redis里比较常见的一种方式了~

在对以上四种方式进行了对比之后得出了数据上的结论:

在一个200次的循环中调用redis请求,第一种最蠢的方案大概是8000ms左右,第二种Promise.all的方案大概在2000ms左右,而第三和第四种方案,大概只需要几十ms就能完成,这真的是质的飞跃啊。

这个线上血淋淋的案例让我决定真的要好好的研究一下redis,不能再轻视它导致犯错。

标签:
来源: http://zjutkz.net/2018/10/28/记一次node上的redis调用优化/#

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有