用戶端app redis nodejs推送訊息 ?

來源:互聯網
上載者:User
目前我的需求是這樣的:
用戶端app(目前只是ios app)準備通過長串連方式串連到伺服器端
我已經查閱了相關的資料 ,php中可以通過 swoole workerman 感覺這2個難度有點大, 感覺對於socket底層不熟悉的難度太大, 後來看了 nodejs 感覺這個應該可以進行實現,今天看了下nodejs ,想使用他的tcp 協議那種形式,暫時不考慮網頁瀏覽器端,代碼如下:

var net = require('net');var server = net.createServer(function(connection) {    console.log('client connected');   connection.on('end', function() {      console.log('用戶端關閉串連');   });   connection.on('data' , function(data){        var strData = data.toString();        var strSign = strData.substr(0, 32);        var strJson = strData.substr(32);        get_redis_data();        console.log(strSign+"---"+strJson);   });      connection.write('Hello World!\r\n');   connection.pipe(connection);});server.listen(8080, function() {   console.log('server is listening');});

上面的代碼只是使用了 nodejs的net模組, 實現了一個用戶端串連到伺服器,用戶端需要觸發一個動作發送訊息到伺服器 , 然後伺服器才返回資訊給用戶端, 那麼問題來了。。
1:我現在要實現的是用戶端使用者登入之後,然後才進行tcp串連,用戶端登入之後 ,會有一個加密的uid參數 , 我會根據這個加密的uid進行推送訊息(查詢當前的使用者是否有新的訊息)
2:目前這個訊息準備採用redis來實現, 那麼問題來了, redis如何儲存這個訊息, 看了下redis 可以使用隊列 , string 之類的, 但是問題是,當給使用者發了訊息之後 ,如果標識這個訊息已經被讀了呢??? 怎麼選擇合適的儲存訊息的格式呢??

請大神們不吝賜教。。。
另外備忘下我的伺服器配置:
*8核的cpu
記憶體:8G
硬碟:固態硬碟
頻寬:公網4M的
裡面目前已經安裝的服務是 web服務, 資料庫服務是在另外的一台上面*
在備忘下:
-----目前有沒有現成的開放平台能實現我上面所說的。。。。。。(需要付費的也沒關係),其實是一句話概括 , 用戶端和服務端保持長串連, 需要進行推送訊息到用戶端

回複內容:

目前我的需求是這樣的:
用戶端app(目前只是ios app)準備通過長串連方式串連到伺服器端
我已經查閱了相關的資料 ,php中可以通過 swoole workerman 感覺這2個難度有點大, 感覺對於socket底層不熟悉的難度太大, 後來看了 nodejs 感覺這個應該可以進行實現,今天看了下nodejs ,想使用他的tcp 協議那種形式,暫時不考慮網頁瀏覽器端,代碼如下:

var net = require('net');var server = net.createServer(function(connection) {    console.log('client connected');   connection.on('end', function() {      console.log('用戶端關閉串連');   });   connection.on('data' , function(data){        var strData = data.toString();        var strSign = strData.substr(0, 32);        var strJson = strData.substr(32);        get_redis_data();        console.log(strSign+"---"+strJson);   });      connection.write('Hello World!\r\n');   connection.pipe(connection);});server.listen(8080, function() {   console.log('server is listening');});

上面的代碼只是使用了 nodejs的net模組, 實現了一個用戶端串連到伺服器,用戶端需要觸發一個動作發送訊息到伺服器 , 然後伺服器才返回資訊給用戶端, 那麼問題來了。。
1:我現在要實現的是用戶端使用者登入之後,然後才進行tcp串連,用戶端登入之後 ,會有一個加密的uid參數 , 我會根據這個加密的uid進行推送訊息(查詢當前的使用者是否有新的訊息)
2:目前這個訊息準備採用redis來實現, 那麼問題來了, redis如何儲存這個訊息, 看了下redis 可以使用隊列 , string 之類的, 但是問題是,當給使用者發了訊息之後 ,如果標識這個訊息已經被讀了呢??? 怎麼選擇合適的儲存訊息的格式呢??

請大神們不吝賜教。。。
另外備忘下我的伺服器配置:
*8核的cpu
記憶體:8G
硬碟:固態硬碟
頻寬:公網4M的
裡面目前已經安裝的服務是 web服務, 資料庫服務是在另外的一台上面*
在備忘下:
-----目前有沒有現成的開放平台能實現我上面所說的。。。。。。(需要付費的也沒關係),其實是一句話概括 , 用戶端和服務端保持長串連, 需要進行推送訊息到用戶端

你的問題是如何在Redis中儲存訊息。針對你的需求,要能有推送列表,同時還需要儲存未讀已讀狀態。
我的方案是分開,將推送訊息列表和訊息列表分開,即每個使用者儲存一個需要推送的訊息列表,以及一個該使用者的曆史訊息列表。
對於訊息推送列表無需儲存任何狀態,推送過去後就從列表移除,不管使用者是否讀取,在推送下發的同時將該訊息添加到使用者的曆史訊息列表,這裡可以儲存訊息的讀取狀態。
曆史訊息列表不建議使用隊列,建議分兩個資料結構儲存,由於訊息列表顯示是根據時間序,所以可以使用redis的有序列表,得分為時間戳記,使用這個有序列表儲存使用者的訊息列表(僅儲存ID,方便查詢分頁),然後訊息的具體資訊,如內容、讀取狀態、時間、發送人等儲存到一個hash結構中,key就是訊息ID。

歡迎指正

寫長串連服務常用的還是socket.io 提供了方便的api去管理串連,並且並發處理的也比較好,不論點對點推送還是群推。SF的訊息推送用的就是這個=W=。推送訊息或接受用戶端訊息流程量大的話可以搭一個Redis的訊息佇列,將socket服務和其他後端模組打通。
http://socket.io/

歡迎參考NoNOIM

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.