Socket.io-redis 确实在某种意义上保持了跟踪..
来自他们的文档
“Redis适配器扩展了内存适配器的广播功能:数据包也被发布到Redis通道(通道名称格式见下文)。
每个 Socket.IO 服务器接收到这个数据包并将其广播到自己的已连接套接字列表中。"
所以基本上,redis 被用作代理来告诉每个套接字服务器基于 X 通道等发出。允许您在集群模式下使用 socket.io 服务器,但正如您所提到的,当您使用它时它可能会不足需要跟踪发射之外的事物。
那么这对我们有什么影响.. 好吧,您可以通过 socket.io-redis 使用自定义钩子,但我个人发现它真的很难理解和使用,并且个人成功有限。我认为使用新版本的 socket.io 和 socket.io redis 进行了一些调整以使其更简单,但我没有尝试过。
相反,我们使用 redis 的 hset 和 jget 来存储用户的 socket 和一个用户的 ID,然后当我们想要让所有用户在线时,我们可以查询 redis 以获取在线用户列表或特定用户的列表房间等
您要做的是添加 redis 包并连接到常规的 pub/sub。
然后,当用户加入房间或您的服务器时,您将执行 hset。在第一次加入时,我们的看起来像这样
redis.hset([collection-name],[Field],[value])
所以在代码中看起来像
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
这将在 redis 中设置一个值,因此集合名称是一个值(对我们来说它是频道的唯一 id)然后我们为字段存储“socket.id”以及一个“昵称”价值。该值是用户 ID 或匿名(如果他们未登录)
然后,当我们想获取房间里的人时,我们使用 hget 命令
redis.HGETALL([collection-name],function(err,results){}
所以在说emit的内部,我们调用redis.HGETALL命令来获取我们传入的特定集合中的所有项目并将其发送回所有连接的用户。