Socket.io-redis v jistém smyslu sleduje...
Z jejich dokumentů
"Adaptér Redis rozšiřuje funkci vysílání adaptéru v paměti:paket je také publikován do kanálu Redis (formát názvu kanálu viz níže).
Každý server Socket.IO přijme tento paket a vysílá jej do vlastního seznamu připojených soketů."
Takže v zásadě se redis používá jako zprostředkovatel, který říká každému soketovému serveru, aby emitoval na základě X kanálu atd. Umožňuje vám mít server socket.io v režimu clusteru, ale jak jste zmínil, může selhat, když potřebujete zachovat sledovat věci mimo jen emit.
Takže kde nás to opouští... Můžete použít vlastní háčky přes socket.io-redis, ale osobně jsem zjistil, že je to opravdu obtížné pochopit a používat a osobně jsem měl omezený úspěch. Myslím, že s novou verzí socket.io a socket.io redis došlo k několika vylepšením, které to zjednodušují, ale nezkoušel jsem je.
Místo toho používáme redis hset a jget k uložení soketu a ID uživatelů, a když pak chceme dostat všechny uživatele online, můžeme dotazem redis získat seznam online uživatelů nebo uživatelů v konkrétní místnosti atd.
Co budete chtít udělat, je přidat balíček redis a připojit se navíc k běžnému pub/sub.
Poté, když se uživatel připojí k místnosti nebo k vašemu serveru, uděláte hset. Při prvním připojení to naše vypadá nějak takto
redis.hset([collection-name],[Field],[value])
Takže v kódu to vypadá jako
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
Tím se nastaví hodnota v redis, takže název kolekce je hodnota (pro nás je to jedinečné id kanálu), poté naskladníme 'socket.id' pro pole spolu s 'přezdívku' pro hodnotu. Tato hodnota je ID uživatele NEBO jeho anonymní, pokud nejsou přihlášeni
Když pak chceme zachytit, kdo je v místnosti, použijeme příkaz hget
redis.HGETALL([collection-name],function(err,results){}
Takže uvnitř řekněme emit zavoláme příkaz redis.HGETALL, abychom dostali všechny položky do konkrétní kolekce, kterou předáme a pošleme zpět všem připojeným uživatelům.