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

时间:2011-12-19 20:19:08

标签: node.js redis socket.io

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

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

现在,我是以错误的方式接近这个还是应该存储userID-> socketID和socketID-> userID对?也许有人可以提供更优雅的解决方案?

1 个答案:

答案 0 :(得分:3)

更优雅的解决方案是使每个套接字连接到通道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可以连接到他的频道,从而验证会话(在此处阅读更多内容:http://www.danielbaulig.de/socket-ioexpress/
  2. 在连接时,在redis中增加userID的值(以便您知道该用户正在侦听的新连接),并在断开连接时减少userID值(以便您知道仍在侦听的连接数)。如果该值为0,则向聊天发出一条消息,指出userID已离开(因为侦听userID通道的连接数为0)。
  3. 当其他用户想要向userID发送消息时,他们不需要连接到userID频道,他们可以向chat频道发送消息并将userID作为属性传递。例如:

    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);
        }
      });