在socket.io中使用RedisStore的示例

Rol*_*n_s 28 redis node.js 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的新手,所以请指出我是否错过了一些明显的东西.

Lin*_*iel 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();
  });
});
Run Code Online (Sandbox Code Playgroud)

这也意味着您必须自己处理更高级的邮件路由,例如通过发布/订阅不同的渠道.有了RedisStore,你该功能免费使用socket.io通道(io.sockets.of("channel").emit(...)).

这可能是一个很大的缺点,就是socket.io会话不会在worker之间共享.如果您使用任何长轮询传输,这可能意味着问题.