【问题标题】:Examples in using RedisStore in socket.io在 socket.io 中使用 RedisStore 的示例
【发布时间】:2012-03-05 06:06:37
【问题描述】:

我正在尝试跨多个进程和/或服务器扩展一个简单的 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 的新手,所以如果我遗漏了一些明显的东西,请指出。

【问题讨论】:

  • 这里是a code snip using RedisStore with node,你可能会觉得有趣;不过,它并没有谈论差异;具有讽刺意味的是,我只是在阅读这个主题:)
  • 这些链接不再起作用 =/

标签: node.js redis socket.io


【解决方案1】:

但我不明白在该代码中使用 RedisStore 与使用 MemoryStore 有何不同。谁能给我解释一下?

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

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

我对@9​​87654323@ 并不十分熟悉,因此我不确定所有差异。但自己动手将是一种完全有效的做法。在这种情况下,您可以将所有消息发布到 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 会话不在工作人员之间共享。如果您使用任何长轮询传输,这可能意味着问题。

【讨论】:

    【解决方案2】:

    我建立了一个小型 github 项目来使用 redis 作为数据存储。

    现在您可以运行多个 socket.io 服务器进程。

    https://github.com/markap/socket.io-scale

    【讨论】:

    • 似乎已经过时了,redisStore 在 socket.io 中不再可用
    【解决方案3】:

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

    不同的是,当你使用'RedisStore'时,socket.io本身会将socket心跳和会话信息保存到Redis中,如果你使用node.js的集群,用户客户端可以工作。

    如果没有redis,客户端下次可能会改变node.js进程,所以会话会丢失。

    【讨论】:

      【解决方案4】:

      不同之处在于,如果你有一个 node.js 实例集群正在运行,memStore 将无法工作,因为它只对单个进程可见。

      【讨论】:

      • 解决办法是什么?
      • 现在正在处理这个问题——这是我为套接字存储 (IPC) 和会话存储所做的工作(您可以与其他服务器共享......比如 Express!)我们正在测试这个现在是集群设置——如果我发现任何问题,我会在这里发帖。 github.com/balderdashy/sails/tree/master/session_experiment
      猜你喜欢
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 2016-11-11
      • 2012-12-14
      • 1970-01-01
      • 2014-06-09
      • 2013-12-13
      相关资源
      最近更新 更多