开发者社区> 问答> 正文

客户端app redis nodejs推送消息 ?

爵霸 2016-03-09 09:47:16 1373

目前我的需求是这样的:
客户端app(目前只是ios app)准备通过长连接方式连接到服务器端
我已经查阅了相关的资料 ,php中可以通过 swoole workerman 感觉这2个难度有点大, 感觉对于socket底层不熟悉的难度太大, 后来看了 nodejs 感觉这个应该可以进行实现,今天看了下nodejs ,想使用他的tcp 协议那种形式,暂时不考虑web 浏览器端,代码如下:

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服务, 数据库服务是在另外的一台上面*
在备注下:
-----目前有没有现成的开放平台能实现我上面所说的。。。。。。(需要付费的也没关系),其实是一句话概括 , 客户端和服务端保持长连接, 需要进行推送消息到客户端

存储 移动开发 JavaScript NoSQL 网络协议 PHP Redis 数据库 数据安全/隐私保护 iOS开发
分享到
取消 提交回答
全部回答(1)
  • 爵霸
    2019-07-17 18:55:24

    你的问题是如何在Redis中保存消息。针对你的需求,要能有推送列表,同时还需要保存未读已读状态。
    我的方案是分开,将推送消息列表和消息列表分开,即每个用户保存一个需要推送的消息列表,以及一个该用户的历史消息列表。
    对于消息推送列表无需保存任何状态,推送过去后就从列表移除,不管用户是否读取,在推送下发的同时将该消息添加到用户的历史消息列表,这里可以保存消息的读取状态。
    历史消息列表不建议使用队列,建议分两个数据结构保存,由于消息列表显示是根据时间序,所以可以使用redis的有序列表,得分为时间戳,使用这个有序列表保存用户的消息列表(仅保存ID,方便查询分页),然后消息的具体信息,如内容、读取状态、时间、发送人等保存到一个hash结构中,key就是消息ID。

    0 0

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程