出處:http://blog.csdn.net/unityoxb/article/details/8532028javascript
push服務是一項頗有用處的技術,它能改善交互,提高用戶體驗。要實現這項服務一般有兩種途徑,輪詢和長鏈接。輪詢就是客戶端每隔一段時間就問服務器拿新數據,實現起來很簡單可是服務器壓力很大,並且大部分請求由於沒有新數據都顯得很浪費。長鏈接則是服務器將一個請求掛起,不輸出任何內容,直到有新數據產生後纔會完成這個請求,瀏覽器收到響應後則立刻再發一個又讓服務器掛住,如此反覆。這麼作的好處是能節省不少無用的請求,可是它不能使用傳統的服務端軟件,好比apache和php-fpm,客戶端多了的話很容易把全部進程佔光,這樣服務器就無法響應新的請求了。php
Node.js讓這一切變得簡單,它是基於事件和非阻塞I/O的服務器技術,能使用極少的資源響應大量併發的請求,很是適合長鏈接的要求。可是這樣作還存在兩個問題。首先你的服務端一般是用另一套語言和框架作的,有成熟的代碼和業務邏輯,爲了實現這個push功能,難道又要用javascript來寫一套嗎?維護起來不嫌麻煩?其次,服務端把請求掛起後,也是不斷地重複調用其它服務來獲取新數據,這不過是把輪詢的代碼換個位置而已,本質上沒區別,對服務器同樣有壓力。java
有沒有什麼簡單的辦法來實現高效的push呢?node
答案是有,並且很簡單,所需代碼不超過20行!git
首先咱們藉助Redis的Pub/Sub功能來實現真正的push,其次用JSON來做爲客戶端和服務端溝通的數據格式。github
當Node.js收到請求後,咱們將請求掛起,同時實例化一個Redis客戶端,並根據請求裏的參數來收聽一個特定的頻道,原有的服務端代碼(好比PHP)處理完業務邏輯後,將新數據用JSON封裝下發布到這個頻道,Node.js收到消息後將其做爲響應傳給客戶端,這樣就完成了一次push。代碼以下:
redis
這個方法簡單易用,你只須要定好一個頻道和數據關係的協議,而後對現有代碼作些簡單修改,就能實現一個高效的push服務了!apache