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

标签 node.js redis socket.io

开门见山: 我正在使用 node.js、socket.io 和 redis 作为私有(private)聊天系统。

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

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

最佳答案

一个更优雅的解决方案是让每个套接字连接到 channel 用户 ID,例如:

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 可以连接到他的 channel ,从而验证 session (阅读更多信息:http://www.danielbaulig.de/socket-ioexpress/)
  2. 在连接时增加 redis 中 userID 的值(以便您知道该用户的新连接正在监听)并在断开连接时减少 userID 值(以便您知道仍在监听的连接数)。如果该值为 0,则您向聊天发送一条消息,说明 userID 已离开(因为监听 userID channel 的连接数为 0)。

当其他用户想要向 userID 发送消息时,他们不需要连接到 userID channel ,他们可以向 chat channel 发送消息并将 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);
    }
  });

关于node.js - 如何使用 node.js + redis 处理用户和套接字对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8567015/

相关文章:

javascript - 使用pdfkit生成pdf文件并发送到nodejs-expressjs中的浏览器

performance - Redis 性能调优

node.js - 如何在一个 Node 服务器中绑定(bind) http 和 https

node.js - 如何仅在我网站的特定页面上使用 socket.io?

javascript - 对多个警报进行编程的最佳方法

mysql - 你如何在 Node.js/Express 中模拟 MySQL(使用 node-orm2)?

javascript - firebase-admin node sdk : Why admin. 数据库既是函数又是属性?

laravel - 使用 Redis GEOADD 存储 JSON 成员是不好的做法吗?

ruby-on-rails - Rails 解决方案记录每个用户操作,以后可以查询

javascript - 安装socket.io返回(node-gyp重建2> builderror.log)|| (0号导出)