Redis
 sql >> Baza danych >  >> NoSQL >> Redis

jak uzyskać dostęp do sesji gniazda we wszystkich klastrach

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Uzyskaj wartość zestawu z Redis za pomocą RedisTemplate

  2. Tworzenie i zarządzanie wieloma połączeniami w Redis Pythonie

  3. Czy polecenie redis incr może ograniczać się do określonej liczby?

  4. Czy biblioteka Hiredis Redis tworzy własny wątek dla asynchronicznych wywołań zwrotnych?

  5. Połączenie WebSocket z adresem <URL> nie powiodło się:Błąd podczas uzgadniania WebSocket:Nieoczekiwany kod odpowiedzi:521