Home >Backend Development >PHP Tutorial >客户端app redis nodejs推送消息 ?
目前我的需求是这样的:
客户端app(目前只是ios app)准备通过长连接方式连接到服务器端
我已经查阅了相关的资料 ,php中可以通过 swoole workerman 感觉这2个难度有点大, 感觉对于socket底层不熟悉的难度太大, 后来看了 nodejs 感觉这个应该可以进行实现,今天看了下nodejs ,想使用他的tcp 协议那种形式,暂时不考虑web 浏览器端,代码如下:
<code>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'); });</code>
上面的代码只是使用了 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 协议那种形式,暂时不考虑web 浏览器端,代码如下:
<code>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'); });</code>
上面的代码只是使用了 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