最近要更新網站架構了,決定轉入 nodejs + socket.io + redis 方式。
戰斗剛開始:
網上的文章太松散,我根據各個網友的分享進行整理 ,讓大家可以方便上手。
進入node.js之路,開始整理的資料
為什么需要 ? node.js + socket.io
node.js提供了高效的服務端運行環境,但是由於瀏覽器端對HTML5的支持不一,為了兼容所有瀏覽器,提供卓越的實時的用戶體驗,並且為程序員提供客戶端與服務端一致的編程體驗,於是socket.io誕生。
Redis是一種高級key-value數據庫。它跟memcached類似,不過數據可以持久化,而且支持的數據類型很豐富。有字符串,鏈表,集 合和有序集合。支持在服務器端計算集合的並,交和補集(difference)等,還支持多種排序功能。所以Redis也可以被看成是一個數據結構服務 器。
Redis的所有數據都是保存在內存中,然后不定期的通過異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數據變化都寫入到一個append only file(aof)里面(這稱為“全持久化模式”)。
安裝Node.js
操作系統是XP和Win7都可以安裝的。
登錄Node.js的官方網站下載:http://www.nodejs.org/,點擊download按鈕
下載最新的windows版本,注意選擇對應的版本,之后安裝就可以了
安裝路徑默認是當前用戶的有權限的目錄。win8,win7等對目錄安全控制較多的系統最好不要放在系統盤,以免后續的npm安裝失敗。
重點注意你的安裝路徑,后期需要用到。盡量放其它盤路徑簡短,方便后續 cmd
安裝完后 在開始>程序>Node.js >Node.js command prompt 輸入相關命令
驗證node.js 安裝是否成功
打開cmd,進入node目錄,輸入node -v
如果我們使用webstorm開發,配置開發環境。在Run/Debug Configuration中,加入環境變量:“NODE_PATH=C:\Program Files\nodejs\node_modules”。除了編輯器的各種功能外,webstorm對Node.js有很好的調試功能。操作簡單,多嘗試就能學會。
安裝下載 webstorm http://www.jetbrains.com/webstorm/
【轉】Webstorm 序列號和證書
WebStorm注冊碼
User Name:
EMBRACE
License Key:
===== LICENSE BEGIN =====
24718-12042010
00001h6wzKLpfo3gmjJ8xoTPw5mQvY
YA8vwka9tH!vibaUKS4FIDIkUfy!!f
3C"rQCIRbShpSlDcFT1xmJi5h0yQS6
===== LICENSE END =====
安裝Redis
是安裝Redis的Node.js客戶端,這樣Node.js程序就可以連接到Redis服務器並進行操作
下面我們再來看一下通過客戶端訪問node.js進行redis存儲的過程
如果你的電腦處於聯網狀態,那么安裝可以把redis-node以npm模塊的形式安裝到node中,以后在引用時直接使用require("redis")就可以了,不需要寫相對路徑了,呵呵,安裝它的方法如下:
npm install redis
npm install hiredis redis
換用 npm install connect-redis
這時,如果安裝成功,就可以做實例了,呵呵!注意,我們的npm install redis這種安裝模塊的命令,是把模塊安裝到當前目錄的,即你的工作項目如果需要redis,需要在工作項目中進行安裝,如果你的工作項目目錄是c:\noderedis,那么安裝模塊后,你的目
錄會多一個node_modules文件夾
https://github.com/mranney/node_redis
下面我們寫一個實例,用來向redis服務器發set和hset串,然后再把redis服務器里所有的鍵名都讀出來
var redis = require("redis"); var client = redis.createClient(); client.on("error", function (err) { console.log("Error " + err); }); client.set("string key", "string val", redis.print); client.hset("hash key", "hashtest 1", "some value", redis.print); client.hset(["hash key", "hashtest 2", "some other value"], redis.print); client.hkeys("hash key", function (err, replies) { console.log(replies.length + " replies:"); replies.forEach(function (reply, i) { console.log(" " + i + ": " + reply); }); client.quit(); });
安裝錯誤提示:
can't find python
貌似只兼容 Python2.50 到 3.0 的版本 這個最新的3.3 就不行了
環境變量
PATH D:\nodejs\npm;D:\Python27
開始使用
中文官網最新下載 http://redis.cn/download.html
參考 Node.js+socket.io實現實時通信 http://www.cnblogs.com/SUN-PH/archive/2013/04/02/2994331.html
參考 Redis的探究
讓nodejs后台運行
讓nodejs應用后台執行,最簡單的辦法是:
nohup node your_app.js &
但是,forever能做更多的事情,比如分別記錄輸出和錯誤日志,比如可以在js中作為api使用。
我們只是很簡單的在命令行里使用它。
使用forever運行nodejs應用 不支持windows
node.js應用生成windows service的plugin——winser
安裝很簡單:
sudo npm install forever -g
使用forever啟動守護進程:
forever start server.js
關閉守護進程:
forever stop server.js
如果需要記錄輸出日志和錯誤:forever start -l forever.log -o out.log -e err.log server.js
下次再運行時會提示forever.log日志已經存在,使用-a追加。
forever start -l forever.log -o out.log -e err.log -a server.js
node服務器開機自啟動
是指要開機自動執行node app.js
嗎?
那就需要把它注冊一個windows service,然后設置這個服務為開機自動啟動。
方法1. 直接使用nssm工具,或者它的node.js包裝程序Winser。
方法2. 直接使用node.js程序,如windows-service或者node-windows。
實現簡單的路由機制
高效率的RESTful請求都傾向於使用HTTP GET方法。GET請求的所有信息都攜帶在請求地址url中。在Node.js里讀取request.url可以獲得請求的url,我們需要對不同的url做路由處理,返回不同的響應數據。Node.js有一個輕量級框架Express,它實現了一個比較好的路由機制,只是他不在我們的學習范圍之中。我們需要的是能夠處理下面路由表的高效的路由機制。
安裝express
npm install express -d
#-g代表安裝到NODE_PATH的lib里面,而-d代表把相依性套件也一起安裝。如果沒有-g的話會安裝目前所在的目錄(會建立一個node_modules的文件夾),結果顯示如下則安裝成功:
驗證express是否安裝成功
安裝完成后,關閉cmd,在重新打開
進入cmd,直接輸入express -V
注意我這里用的大寫V
Instagram的實時圖片Demo:Node.js, Redis 加 Web Sockets
Instagram公布其實時圖片API的演示網站(http://demo.instagram.com/)的源碼,這個網站是用Node.js、Redis和Web Sockets,主要使用了Redis的pub/sub機制來進行消息推送。
官方源碼: https://github.com/Instagram/Realtime-Demo
好事者的更新: https://github.com/asalant/Realtime-Demo
Materials:
使用 Node.js 作為完整的雲環境開發堆棧
http://www.ibm.com/developerworks/cn/cloud/library/cl-nodejscloud/index.html
Reds:一個Redis加Node.js的全文搜索引擎
http://blog.nosqlfan.com/html/2676.html
Node.js與服務端模板引擎
http://ittechnical.sinaapp.com/node-js-and-server-side-template/
客戶端 var socket = io.connect(host,options);
io.on
-> connect : socket.on('connect',function(){});當socket與后端成功建立鏈接后 -> connecting : socket.on('connecting',function(){});socket正在與服務器建立鏈接 -> disconnect : socket.on('disconnect',function(){});當與服務器斷開鏈接s -> connect_failed : socket.on('connect_failed',function(){});與服務器鏈接失敗 -> error : socket.on('error',function(){});當一個錯誤發生而且不能被處理 -> message : socket.on('message',function(message,[callback]){});通過send方法發送到服務器端,並且被服務器接受並返回到客戶端接受后處理的數據 -> anything : socket.on('anything',function(data,[callback]){});可以是任意事件,除了保留的事件之外 -> reconnect_failed : socket.on('reconnect_failed',function(){});socket再次鏈接失敗 -> reconnect : socket.on('reconnect',function(){});重新鏈接並且成功 -> reconnecting : socket.on('reconnecting',function{});重新鏈接還在鏈接中..
服務器
var io = require('socket.io');
io.on
->connection : io.on('connection',function(socket){});初始化一個socket ->message : io.on('message',function(message,callback){});接受客戶端send()方法發送過來服務器的數據 ->anything : io.on('anything',function(data){});除了庫保留的事件外任意自定義事件 ->disconnect : io.on('disconnect',function(){});中端socket鏈接
日報系統 http://waltershe.github.io/ribao/
在Visual Studio中利用NTVS創建開發 nodejs