在socket.io中使用RedisStore的示例

时间:2012-02-13 20:09:47

标签: node.js redis socket.io

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

4 个答案:

答案 0 :(得分:27)

  

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

不同之处在于,当使用默认的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会话不会在worker之间共享。如果您使用任何长轮询传输,这可能意味着问题。

答案 1 :(得分:3)

我设置了一个小的github项目,使用redis作为数据存储区。

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

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

答案 2 :(得分:2)

  

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

不同之处在于,当您使用“RedisStore”时,socket.io本身会将套接字心跳和会话信息保存到Redis中,如果您将群集与node.js一起使用,则用户客户端可以正常工作。

如果没有redis,客户端可能会在下次更改node.js进程,因此会话将丢失。

答案 3 :(得分:0)

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