在socket.io中使用RedisStore的例子

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

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

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

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

另外configurationsocket.io使用redisstore与创build自己的redis客户端和设置/获取自己的数据有什么区别?

我是新来的node.js,socket.io和redis所以请指出,如果我错过了一些明显的东西。

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

不同之处在于,在使用默认的MemoryStore ,在worker中发出的任何消息只会发送给连接到同一个worker的客户端,因为worker之间没有IPC。 使用RedisStore ,你的消息将被发布到你所有工作人员所订阅的redis服务器上。 因此,该消息将被所有工作人员以及所有连接的客户端拾取并广播。

另外configurationsocket.io使用redisstore与创build自己的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(...) )免费获得该function。

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

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

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

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

另外configurationsocket.io使用redisstore与创build自己的redis客户端和设置/获取自己的数据有什么区别?

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

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

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