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的同窗隨時和我交流討論。