如何用node.js + redis处理用户和套接字对

直截了当地说:我使用node.js,socket.io和redis作为私人聊天系统。

在连接用户传递他的网站id(userID)到node.js服务器。 他可能有多个连接,所以我必须以某种方式配对每个连接的socketID和用户ID。 我一直在考虑使用redis来存储userID-> sessionID对。 但是,当用户断开连接,我需要从redis中删除这对,但我只有socketID不是用户ID,所以我不能通过该键select..

现在,我接近这个错误的方式,或者我应该同时存储userID-> socketID和socketID-> userID对? 也许有人能提供更优雅的解决scheme?

一个更优雅的解决scheme是使每个套接字连接到通道userID,例如:

io.sockets.on('connection', function (socket) { socket.join(userID); }); // when you want somebody to send a message to userID you can do: io.sockets.in(userID).emit(message); 

有两件事你需要照顾在这里:

  1. 确保只有userID可以连接到他的频道,从而validation会话(阅读更多在这里: http : //www.danielbaulig.de/socket-ioexpress/ )
  2. 在连接上增加redis中userID的值(这样你就知道该用户的一个新连接正在监听),并在断开连接时减lessuserID值(以便知道仍在监听的连接数)。 如果值为0,则向聊天消息发送消息,指出该用户ID已经离开(因为侦听用户ID通道的连接数为0)。

当其他用户想要发送消息到用户ID时,他们不需要连接到用户ID通道,他们可以发送消息到chat通道,并通过用户ID作为属性。 例如:

 var chat = io .of('/chat') .on('connection', function (socket) { // connected to public chat }) .on('message', function (data) { if (data.userID && data.message) { io.sockets.in(userID).emit('UserX: ' + data.message); } });