Node.js是一个基于Chrome V8引擎的js运行环境node
在服务器端语言好比Java,PHP中,每一次客户的链接都会伴随着服务器建立一个新的线程,每一个线程大约占据4MB的内存,若是一个服务器内存是16GB,大约容许8000个用户同时链接,若是给更多用户提供服务,就只能增长硬件成本。
而Node.js只是用一个线程,每当有用户链接出发一个内部事件,经过非阻塞IO,事件驱动机制,在宏观上是并行的,一样16GB内存的服务器,Node.js容许用户链接的数量大约是8w个,而且操做系统没有建立、销毁线程的时间开销。数据库
首先两个代码块来解释阻塞IO,和非阻塞IO的区别
阻塞:express
var getUserSync = require('./getUserSync'); var user1 = getUserSync('123'); console.log('user1', user1); var user2 = getUserSync('321'); cnosole.log('user2', uer2); var sum = 1 + 2; console.log('The sum is' + sum);
在用id向数据库获取用户的时候,就是一次IO操做,这会花费必定的时间,而获取user2的IO操做必须等到user1获取完成,也就是说,获取user1的时候,IO被阻塞了。时间图以下:npm
非阻塞:缓存
var getUser = require('./getUser'); getUser('123', function (user1){ console.log('user1', user1); }); getUser('321', function (user2){ console.log('user2', user2); }); var sum = 1 + 2; console.log('The sum is ' + sum);
因为node.js自己的事件处理机制,获取user1,user2的过程是同时进行的,而且不会影响sum变量的初始化,所以能够节省处理时间,这就是非阻塞IO的优点所在。时间图以下:服务器
事件驱动主要用于完成服务器的任务调度网络
基于事件驱动是有不少好处的,这里举例说明事件驱动解决的问题之一并发
所谓雪崩问题指的是在数据库缓存缺失的状况下大量请求并发涌入数据库查询,一般来讲能够经过加状态锁解决,可是单纯的添加状态所会致使只有一次数据服务发生,下面代码对问题进行了解决:框架
var proxy = new EventProxy(); var status = "ready"; var select = function (callback) { proxy.once("selected", callback); if (status === "ready") { status = "pending"; db.select("SQL", function (results) { proxy.emit("selected", results); status = "ready"; }); } };
node.js的三大特性就是咱们选择node.js的缘由也是Ryan Dahl当初创造node.js的初衷,当应用程序须要处理大量并发的IO,而在客户端发出响应以前,应用程序内部并不须要进行很是复杂的计算处理(由于单线程意味着某一个用户请求处理的失败可能会致使全部请求的崩溃)的时候,Node.js很是适合,同时也很是适合处理长时间链接实时交互应用程序(由于存在大量IO)。学习
学习node.js主要是不断的深刻理解使用下面几个内容(下面的一些module也仅仅是我近两天学习接触到的,node成为趋势缘由之一就是由于良好的社区生态,因此你们必定要利用好:https://www.npmjs.com/),最好找一些简单的实战项目上手
欢迎正在学习或者想要学习nodejs的同窗随时和我交流讨论。