Socket.io-redis holder på en måde styr på...
Fra deres dokumenter
"Redis-adapteren udvider broadcast-funktionen af in-memory-adapteren:pakken udgives også til en Redis-kanal (se nedenfor for formatet på kanalnavnet).
Hver Socket.IO-server modtager denne pakke og sender den til sin egen liste over tilsluttede stik."
Så dybest set bruges redis som mægler til at fortælle hver socket-server at udsende baseret på X-kanal osv. Giver dig mulighed for at have en socket.io-server i klyngetilstand til at fungere, men som du har nævnt, kan den komme til kort, når du skal beholde spore ting uden for blot en emit.
Så hvor efterlader dette os.. Godt du kan bruge tilpassede kroge via socket.io-redis, men personligt fandt jeg det virkelig svært at forstå og bruge og havde begrænset succes personligt. Jeg tror, at med den nye version af socket.io og socket.io redis var der nogle justeringer for at gøre dette enklere, men jeg har ikke prøvet dem.
I stedet, hvad vi gør er at bruge redis hset og jget til at gemme socket og et id for en bruger, så når vi ønsker at få alle brugere online, kan vi forespørge redis for at få listen over online brugere eller brugere i et specifikt rum osv.
Det, du vil gøre, er at tilføje redis-pakken og oprette forbindelse til den almindelige pub/sub.
Så, når en bruger tilmelder sig et rum eller din server for den sags skyld, vil du lave et hset. Ved den første tilslutning ser vores noget sådan her ud
redis.hset([collection-name],[Field],[value])
Så i kode ser det ud som
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
Dette vil sætte en værdi i redis, så samlingsnavnet er en værdi (for os er det et unikt id for kanalen), så lagerfører vi 'socket.id' for feltet sammen med et 'kaldenavn' for værdien. Denne værdi er brugerens ID ELLER den er anonym, hvis de ikke er logget ind
Når vi derefter vil have fat i, hvem der er i et rum, bruger vi kommandoen hget
redis.HGETALL([collection-name],function(err,results){}
Så inden for f.eks. emitten kalder vi redis.HGETALL-kommandoen for at få alle elementer i en specifik samling, som vi sender ind og sende det tilbage til alle tilsluttede brugere.