一尘不染

如何使用Node.js + Redis处理用户和套接字对

redis

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

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

现在,我是用错误的方式来处理还是应该同时存储userID-> socketID和socketID-> userID对?也许有人可以提供更优雅的解决方案?


阅读 232

收藏
2020-06-20

共1个答案

一尘不染

一个更优雅的解决方案是使每个套接字都连接到通道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)。

当其他用户想要向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);
    }
  });
2020-06-20