Socket.io-redis håller koll på ett sätt...
Från deras dokument
"Redis-adaptern utökar sändningsfunktionen för minnesadaptern:paketet publiceras också till en Redis-kanal (se nedan för formatet på kanalnamnet).
Varje Socket.IO-server tar emot detta paket och sänder det till sin egen lista över anslutna uttag."
Så i grund och botten används redis som mäklare för att tala om för varje socketserver att sända baserat på X-kanal etc. Så att du kan ha en socket.io-server i klusterläge som fungerar, men som du har nämnt kan den missa när du behöver behålla spåra saker utanför bara en emit.
Så var lämnar detta oss .. Jo du kan använda anpassade krokar via socket.io-redis men personligen tyckte jag att det var riktigt svårt att förstå och använda och hade begränsad framgång personligen. Jag tror att med den nya versionen av socket.io och socket.io redis fanns det några justeringar för att göra detta enklare men jag har inte provat dem.
Istället, vad vi gör är att använda redis hset och jget för att lagra socket och ett ID för en användare, sedan när vi vill få alla användare online kan vi fråga redis för att få listan över onlineanvändare eller användare i ett specifikt rum etc.
Vad du vill göra är att lägga till redis-paketet och ansluta i tillägg till den vanliga puben/suben.
Sedan, när en användare går med i ett rum eller din server för den delen kommer du att göra en hset. Vid första anslutningen ser vårt ut ungefär så här
redis.hset([collection-name],[Field],[value])
Så i koden ser det ut som
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
Detta kommer att ställa in ett värde i redis, så samlingsnamnet är ett värde (för oss är det ett unikt id för kanalen) sedan lagrar vi 'socket.id' för fältet tillsammans med ett 'smeknamn' för värdet. Detta värde är användarens ID ELLER det är anonymt om de inte är inloggade
Sedan, när vi vill ta tag i vem som är i ett rum använder vi kommandot hget
redis.HGETALL([collection-name],function(err,results){}
Så inuti säg emit anropar vi kommandot redis.HGETALL för att hämta alla föremål i en specifik samling som vi skickar in och skicka tillbaka det till alla anslutna användare.