node上的redis调用优化示例详解

 更新时间:2018年10月30日 14:34:09   作者:zjutkz  
这篇文章主要给大家介绍了关于node上redis调用优化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

如果一个 Node 应用有多台服务器或多个进程在跑,每个进程都拥有自己的内存空间,各个进程之间的数据共享就显得非常重要。

使用数据库是一个解决数据共享的方案,但一些临时性、高并发的数据并不太适合直接写入数据库,比如 session。

引入 Redis 可以解决数据共享的问题,也因为 Redis 是基于内存存储的特点,有着非常高的性能,可以大大降低数据库读写的压力,提升应用的整体性能。

Redis 还可以用来:缓存复杂的数据库查询结果,做自增长统计,暂存用户操作状态等功能。

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

最蠢的方式

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

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

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

使用Promise.all优化请求

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

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的正确使用姿势

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

let batch = await RedisClient.getClient().batch();
for(let i = 0; i < params.length; i++) {
 batch.get(redisKey);
}
batch.exec();

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

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

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,不能再轻视它导致犯错。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • node.js博客项目开发手记

    node.js博客项目开发手记

    本篇文章给大家总结了node.js博客项目开发的相关步骤以及知识点分享,有兴趣的朋友参考下。
    2018-03-03
  • nodejs后台集成ueditor富文本编辑器的实例

    nodejs后台集成ueditor富文本编辑器的实例

    本篇文章主要介绍了nodejs后台集成ueditor富文本编辑器的实例,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • Node.js中的HTTP模块与URL模块

    Node.js中的HTTP模块与URL模块

    这篇文章介绍了Node.js中的HTTP模块与URL模块,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Node.js中使用计时器定时执行函数详解

    Node.js中使用计时器定时执行函数详解

    这篇文章主要介绍了Node.js中使用计时器定时执行函数详解,本文使用了Node.js中的setTimeout和setInterval函数,需要的朋友可以参考下
    2014-08-08
  • Nodejs Stream 数据流使用手册

    Nodejs Stream 数据流使用手册

    这篇文章主要介绍了Nodejs Stream 数据流使用手册的相关资料,感兴趣的小伙伴一起学习吧
    2016-04-04
  • Node.js的基本应用你知道多少

    Node.js的基本应用你知道多少

    这篇文章主要为大家详细介绍了Node.js的基本应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Node.js queryString 解析和格式化网址查询字符串工具使用

    Node.js queryString 解析和格式化网址查询字符串工具使用

    这篇文章主要为大家介绍了Node.js queryString 解析和格式化网址查询字符串工具使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • nodejs中安装ghost出错的原因及解决方法

    nodejs中安装ghost出错的原因及解决方法

    本篇文章主要介绍了nodejs中安装ghost出错的原因及解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • node前端开发模板引擎Jade的入门

    node前端开发模板引擎Jade的入门

    这篇文章主要介绍了node前端开发模板引擎Jade的入门,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 实例详解Node.js 函数

    实例详解Node.js 函数

    这篇文章主要介绍了Node.js 函数 ,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2018-06-06

最新评论