Socket.io-redis tiene traccia in un certo senso..
Dai loro documenti
"L'adattatore Redis estende la funzione di trasmissione dell'adattatore in memoria:il pacchetto viene pubblicato anche su un canale Redis (vedi sotto per il formato del nome del canale).
Ogni server Socket.IO riceve questo pacchetto e lo trasmette al proprio elenco di socket collegati."
Quindi, in pratica, redis viene utilizzato come broker per dire a ciascun server socket di emettere in base al canale X ecc. Consentendoti di avere un server socket.io in modalità cluster funzionante, ma come hai detto può non essere all'altezza quando è necessario mantenere traccia di cose al di fuori di una semplice emissione.
Quindi, dove ci lascia questo .. Bene, puoi usare hook personalizzati tramite socket.io-redis ma personalmente l'ho trovato davvero difficile da capire e da usare e personalmente ho avuto un successo limitato. Penso che con la nuova versione di socket.io e socket.io redis ci siano state alcune modifiche per renderlo più semplice, tuttavia non le ho provate.
Invece, quello che facciamo è usare redis hset e jget per memorizzare il socket e un ID di un utente, quindi quando vogliamo portare tutti gli utenti online possiamo interrogare redis per ottenere l'elenco degli utenti online o degli utenti in una stanza specifica ecc.
Quello che vorrai fare è aggiungere il pacchetto redis e connetterti in aggiunta al normale pub/sub.
Quindi, quando un utente si unisce a una stanza o al tuo server, eseguirai un hset. Al primo ingresso il nostro sembra qualcosa del genere
redis.hset([collection-name],[Field],[value])
Quindi nel codice sembra
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
Questo imposterà un valore in redis, quindi il nome della raccolta è un valore (per noi è un ID univoco del canale), quindi immagazziniamo il "socket.id" per il campo insieme a un "nick-name" per il valore. Questo valore è l'ID utente OPPURE è anonimo se non hanno effettuato l'accesso
Quindi, quando vogliamo catturare chi è in una stanza, utilizziamo il comando hget
redis.HGETALL([collection-name],function(err,results){}
Quindi, all'interno di diciamo l'emit, chiamiamo il comando redis.HGETALL per ottenere tutti gli elementi all'interno di una raccolta specifica che passiamo e rispedirli a tutti gli utenti connessi.