Socket.io-redis behält gewissermaßen den Überblick..
Aus ihren Dokumenten
"Der Redis-Adapter erweitert die Broadcast-Funktion des In-Memory-Adapters:Das Paket wird auch an einen Redis-Kanal veröffentlicht (siehe unten für das Format des Kanalnamens).
Jeder Socket.IO-Server empfängt dieses Paket und sendet es an seine eigene Liste verbundener Sockets."
Im Grunde genommen wird Redis als Broker verwendet, um jedem Socket-Server mitzuteilen, dass er basierend auf dem X-Kanal usw. emittieren soll. So können Sie einen socket.io-Server im Cluster-Modus verwenden, aber wie Sie bereits erwähnt haben, kann dies zu kurz kommen, wenn Sie ihn behalten müssen Verfolgung von Dingen außerhalb einer Emission.
Wo bleibt uns das? Nun, Sie können benutzerdefinierte Hooks über socket.io-redis verwenden, aber ich persönlich fand es wirklich schwierig zu verstehen und zu verwenden, und hatte persönlich nur begrenzten Erfolg. Ich denke, mit der neuen Version von socket.io und socket.io redis gab es einige Optimierungen, um dies einfacher zu machen, aber ich habe sie nicht ausprobiert.
Stattdessen verwenden wir redis hset und jget, um den Socket und eine ID eines Benutzers zu speichern. Wenn wir dann alle Benutzer online bringen möchten, können wir redis abfragen, um die Liste der Online-Benutzer oder Benutzer in einem bestimmten Raum usw. zu erhalten.
Was Sie tun möchten, ist das Redis-Paket hinzuzufügen und sich zusätzlich mit dem regulären Pub / Sub zu verbinden.
Wenn dann ein Benutzer einem Raum oder Ihrem Server beitritt, machen Sie ein hset. Bei der ersten Verknüpfung sieht unsere in etwa so aus
redis.hset([collection-name],[Field],[value])
Im Code sieht es also so aus
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
Dadurch wird ein Wert in redis festgelegt, sodass der Sammlungsname ein Wert ist (für uns ist es eine eindeutige ID des Kanals), dann speichern wir die „socket.id“ für das Feld zusammen mit einem „Spitznamen“ für den Wert. Dieser Wert ist die Benutzer-ID ODER anonym, wenn sie nicht angemeldet sind
Wenn wir dann erfassen wollen, wer sich in einem Raum befindet, verwenden wir den hget-Befehl
redis.HGETALL([collection-name],function(err,results){}
Also innerhalb von sagen wir der Ausgabe rufen wir den Befehl redis.HGETALL auf, um alle Elemente in einer bestimmten Sammlung zu erhalten, die wir übergeben und an alle verbundenen Benutzer zurücksenden.