小编典典

在socket.io中使用RedisStore的示例

redis

我正在尝试在多个进程和/或服务器上扩展一个简单的socket.io应用程序。

Socket.io支持RedisStore,但是我对如何使用它感到困惑。

我正在看这个例子, http://www.ranu.com.ar/post/50418940422/redisstore-and-rooms-with-
socket-io

但是我不明白在该代码中使用RedisStore与使用MemoryStore有何不同。有人可以向我解释吗?

另外,将socket.io配置为使用redisstore与创建自己的redis客户端并设置/获取自己的数据之间有什么区别?

我是node.js,socket.io和redis的新手,所以请指出是否错过了明显的事情。


阅读 510

收藏
2020-06-20

共1个答案

小编典典

但是我不明白在该代码中使用RedisStore与使用MemoryStore有何不同。有人可以向我解释吗?

不同之处在于,当使用default时MemoryStore,您在工作线程中发出的任何消息都只会发送给连接到同一工作线程的客户端,因为工作线程之间没有IPC。使用RedisStore,您的消息将被发布到Redis服务器,您的所有工作人员都将订阅该服务器。因此,该消息将被所有工作人员以及所有连接的客户端接收并广播。

另外,将socket.io配置为使用redisstore与创建自己的redis客户端并设置/获取自己的数据之间有什么区别?

我对并不是很熟悉RedisStore,因此我不确定所有差异。但是,自己动手将是一种完全有效的做法。在这种情况下,您可以将所有消息发布到redis服务器,并在套接字处理程序中侦听消息。这可能为您带来更多工作,但您也将对设置方式有更多的控制权。我自己做了类似的事情:

// Publishing a message somewhere
var pub = redis.createClient();
pub.publish("messages", JSON.stringify({type: "foo", content: "bar"}));

// Socket handler
io.sockets.on("connection", function(socket) {
  var sub = redis.createClient();
  sub.subscribe("messages");
  sub.on("message", function(channel, message) {
    socket.send(message);
  });

  socket.on("disconnect", function() {
    sub.unsubscribe("messages");
    sub.quit();
  });
});

这也意味着您必须自己进行更高级的消息路由,例如通过发布/订阅不同的渠道。使用RedisStore,您可以使用socket.io通道(io.sockets.of("channel").emit(...))免费获得该功能。

一个潜在的大缺点是socket.io会话不能在工作人员之间共享。如果您使用任何长轮询传输方式,则可能意味着问题。

2020-06-20