<table>
<tbody><tr>
<td>
<div>
<p>Node.js 受益于它的事件驱动和异步的特征,已经很快了。但是,在现代网络中只是快是不行的。如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异常的快。本文将介绍 10 条,经过检验得知可大大提高 Node 应用的技巧。废话不多说,让我们逐条来看看。</p>
<h2>1. 并行</h2>
<p>创建 Web 应用的时候,你可能要多次调用内部 API 来获取各种数据。比如说,假设在 Dashboard 页面上,你要执行下面这几个调用:</p>
<ul>
<li>
<p>用户信息 -getUserProfile().</p>
</li>
<li>
<p>当前活动 -getRecentActivity().</p>
</li>
<li>
<p>订阅内容 -getSubscriptions().</p>
</li>
<li>
<p>通知内容 -getNotifications().</p>
</li>
</ul>
</div>
</td>
</tr>
</tbody></table> <table>
<tbody><tr>
<td>
<div>
<p>为了拿到这些信息,你应该会为每个方法创建独立的中间件,然后将它们链接到 Dashboard 路由上。不过问题是,这些方法的执行是线性的,上一个没结束之前下一个不会开始。可行解决案是并行调用它们。</p>
<p>如你所知由于异步性,Node.js 非常擅长并行调用多个方法。我们不能暴殄天物。我上面提到的那些方法没有依赖性,所以我们可以并行执行它们。这样我们可以削减中间件数量,大幅提高速度。</p>
<p>
我们可以用async.js来处理并行,它是一个专门用来调教 JavaScript 异步的 Node 模块。下面代码演示怎样用 async.js 并行调用多个方法的: </p>
<pre class="prettyprint javascript"><span class="function"><span class="keyword">function</span> <span class="title">runInParallel</span><span class="params">()</span> {</span>

async.parallel([

getUserProfile,

getRecentActivity,

getSubscriptions,

getNotifications

], function(err, results) {

//This callback runs when all the functions complete

});

}

如果你想更深入了解 async.js ,请移步它的 GitHub

页面。

<table>
<tbody><tr>
<td>
<div>
<h2>2. 异步</h2>
<p>根据设计 Node.js 是单线程的。基于这点,同步代码会堵塞整个应用。比如说,多数的文件系统 API 都有它们的同步版本。下面代码演示了文件读取的同步和异步两种操作:</p>
<pre class="prettyprint javascript"><span class="comment">// Asynchronous</span>

fs.readFile('file.txt', function(err, buffer) {

var content = buffer.toString();

});

// Synchronous

var content = fs.readFileSync('file.txt').toString();

不过要是你执行那种长时间的阻塞操作,主线程就会被阻塞到这些操作完成为止。这大大降低你应用的性能。所以,最好确保你的代码里用的都是异步版本 API,最起码你应该在性能节点异步。而且,你在选用第三方模块的时候也要很小心。因为当你想方设法把同步操作从你代码中剔除之后,一个外部库的同步调用会让你前功尽弃,降低你的应用性能。

<table>
<tbody><tr>
<td>
<div>
<h2>3. 缓存</h2>
<p>如果你用到一些不经常变化的数据,你应该把它们缓存起来,改善性能。比如说,下面的代码是获取最新帖子并显示的例子:</p>
<pre class="prettyprint javascript"><span class="keyword">var</span> router = express.Router();

router.route('/latestPosts').get(function(req, res) {

Post.getLatest(function(err, posts) {

if (err) {

throw err;

}

res.render(<span class="string">'posts'</span>, { posts: posts });

});

});

如果你不经常发贴的话,你可以把帖子列表缓存起来,然后一段时间之后再把它们清理掉。比如,我们可以用Redis模块来达到这个目的。当然,你必须在你的服务器上装 Redis。然后你可以用叫做 node_redis的客户端来保存键/值对。下面的例子演示我们怎么缓存帖子:

var redis = require('redis'),

client = redis.createClient(null, null, { detect_buffers: true }),

router = express.Router(); router.route('/latestPosts').get(function(req,res){

client.get('posts', function (err, posts) {

if (posts) {

return res.render('posts', { posts: JSON.parse(posts) });

}
Post.getLatest(<span class="keyword">function</span>(err, posts) {
<span class="keyword">if</span> (err) {
<span class="keyword">throw</span> err;
} client.set(<span class="string">'posts'</span>, JSON.stringify(posts));
res.render(<span class="string">'posts'</span>, { posts: posts });
});

});

});

看到了吧,我们首先检查 Redis 缓存,看看是否有帖子。如果有,我们从缓存中拿这些帖子列表。否则我们就检索数据库内容,然后把结果缓存。此外,一定时间之后,我们可以清理 Redis 缓存,这样就可以更新内容了。

让你的 Node.js 应用跑得更快的 10 个技巧的更多相关文章

  1. 让你的 Node.js 应用跑得更快的 10 个技巧(转)

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

  2. 让DB2跑得更快——DB2内部解析与性能优化

    让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!)  洪烨著 2013年10月出版 定价:7 ...

  3. UOJ 【UR #5】怎样跑得更快

    [UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...

  4. 【UOJ#62】【UR #5】怎样跑得更快(莫比乌斯反演)

    [UOJ#62][UR #5]怎样跑得更快(莫比乌斯反演) 题面 UOJ 题解 众所周知,\(lcm(i,j)=\frac{ij}{gcd(i,j)}\),于是原式就变成了: \[\sum_{j=1} ...

  5. 「UR#5」怎样跑得更快

    「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...

  6. 面试官:如何写出让 CPU 跑得更快的代码?

    前言 代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能. CPU 内部嵌入了 CPU ...

  7. 学信网改绑手机号码,但是忘记了老号码怎么办?利用node.js + puppeteer 跑脚本实现改绑手机号

    最近登录学信网发现自己学信网上绑定的手机号码不是目前自己使用的手机号码,于是想改绑手机号,但是发现不记得之前的手机号码了: 于是百度各种方法都无济于事:也不想重新注册账号,最后看见一篇文章通过Pyth ...

  8. 利用iisnode模块,让你的Node.js应用跑在Windows系统IIS中

    最近比较喜欢用Node.js做一些简单的应用,一直想要部署到生产环境中,但是手上只有一台windows server 2008服务器,并且已经开启了IIS服务,运行了很多.Net开发的网站,80端口已 ...

  9. Node.js在跑Express的时候有个时候会卡住按一下Ctrl+C又好了的解决办法

    Node.js编写了一个基于Express的Web应用,但是有的时候这个应用会卡死. 后来发现原因是我使用了Windows原生的命令行,会出现这个问题. 也就是说我是在文件夹下面Shift+鼠标右键, ...

随机推荐

  1. 用户名 不在 sudoers文件中,此事将被报告

    解决方法: 1.通过编辑器来打开/etc/sudoers 2.直接使用命令visudo 打开sudoers后,如下加上自己的帐号保存后就可以了. # User privilege specificat ...

  2. python学习(3)

    Python学习(3)切片(Slice):根据索引范围取出字符串里面的内容,比如: l=range(100)   l[:8] [0, 1, 2, 3, 4, 5, 6, 7]              ...

  3. Java+7入门经典 -2 数据

    第2章 程序,数据,变量和计算 2.1 数据和变量 变量是一段有名字的内存, 存储程序中的信息, 描述事物的数据项; 每段定义了名字的内存只能存储一种特定类型的数据. Type; 编译器会检测错误的类 ...

  4. iOS中的imageIO与image解码

    ImageIO对外开放的对象有CGImageSourceRef.CGImageDestinationRef,不对外开放的对象有CGImageMetadataRef.CoreGraphics中经常与im ...

  5. javascript中的内置对象

    2015.12.1 javascript中的内置对象 复习: 1.js中的内置函数 alert prompt write parseInt parseFloat eval isNaN document ...

  6. [Form Builder]:CREATE_GROUP Built-in

    Description  Creates a non-query record group with the given name. The new record group has no colum ...

  7. JVM笔记5:Class文件结构

    Class文件是一组以8位字节为基础单位的二进制流,包含多个数据项目(数据项目的顺序,占用的字节数均由规范定义),各个数据项目严格按照顺序紧凑的排列在Class文件中,不包含任何分隔符,使得整个Cla ...

  8. <转载>解决div里面img的缝隙问题

    转载自:http://blog.sina.com.cn/s/blog_9fd5b6df01013mld.html   练习切图时发现img和父级div之间总是有2px空隙(chrome),上网搜索解决 ...

  9. Git之路--2

  10. 转载---SQL Server XML基础学习<1>之--FOR XML PATH

    --> 测试数据:#tbIF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL    DROP TABLE #tbGO CREATE TABLE #tb      ...