Socket.io-redis śledzi w pewnym sensie.
Z ich dokumentów
„Adapter Redis rozszerza funkcję rozgłaszania adaptera w pamięci:pakiet jest również publikowany w kanale Redis (format nazwy kanału znajduje się poniżej).
Każdy serwer Socket.IO odbiera ten pakiet i wysyła go do własnej listy podłączonych gniazd."
Zasadniczo redis jest używany jako broker, który informuje każdy serwer gniazd, aby emitował w oparciu o kanał X itp. Pozwala to na pracę serwera socket.io w trybie klastra, ale jak wspomniałeś, może to nie wystarczyć, gdy musisz zachować śledzić rzeczy poza tylko emisją.
Więc gdzie nas to zostawia… Cóż, możesz użyć niestandardowych haków przez socket.io-redis, ale osobiście uważam, że jest to naprawdę trudne do zrozumienia i użytkowania i osobiście odniosłem ograniczony sukces. Myślę, że w nowej wersji socket.io i socket.io redis wprowadzono kilka poprawek, aby to uprościć, ale ich nie wypróbowałem.
Zamiast tego używamy redis hset i jget do przechowywania gniazda i identyfikatora użytkowników, a gdy chcemy udostępnić wszystkich użytkowników online, możemy wysłać zapytanie redis, aby uzyskać listę użytkowników online lub użytkowników w określonym pokoju itp.
To, co chcesz zrobić, to dodać pakiet redis i połączyć się dodatkowo ze zwykłym pub / sub.
Następnie, gdy użytkownik dołączy do pokoju lub serwera, zrobisz hset. Przy pierwszym dołączeniu nasz wygląda mniej więcej tak
redis.hset([collection-name],[Field],[value])
Więc w kodzie wygląda to tak
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
Spowoduje to ustawienie wartości w redis, więc nazwa kolekcji jest wartością (dla nas jest to unikalny identyfikator kanału), a następnie przechowujemy „socket.id” dla pola wraz z „nick-name” dla wartości. Ta wartość to identyfikator użytkownika LUB jego anonimowość, jeśli nie są zalogowani
Następnie, gdy chcemy złapać, kto jest w pokoju, używamy polecenia hget
redis.HGETALL([collection-name],function(err,results){}
Tak więc wewnątrz powiedzmy emit, wywołujemy polecenie redis.HGETALL, aby pobrać wszystkie elementy z określonej kolekcji, które przekazujemy, i odesłać je z powrotem do wszystkich podłączonych użytkowników.