Heim > Backend-Entwicklung > PHP-Tutorial > 客户端app redis nodejs推送消息 ?

客户端app redis nodejs推送消息 ?

WBOY
Freigeben: 2016-06-06 20:20:21
Original
1773 Leute haben es durchsucht

目前我的需求是这样的:
客户端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>
Nach dem Login kopieren
Nach dem Login kopieren

上面的代码只是使用了 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>
Nach dem Login kopieren
Nach dem Login kopieren

上面的代码只是使用了 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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage