sql >> Database >  >> NoSQL >> Redis

hoe toegang te krijgen tot socketsessie in alle clusters

Socket.io-redis houdt het in zekere zin bij..

Uit hun documenten

"De Redis-adapter breidt de uitzendfunctie van de in-memory adapter uit:het pakket wordt ook gepubliceerd naar een Redis-kanaal (zie hieronder voor het formaat van de kanaalnaam).

Elke Socket.IO-server ontvangt dit pakket en zendt het uit naar zijn eigen lijst met aangesloten sockets."

Dus eigenlijk wordt redis gebruikt als de makelaar om elke socketserver te vertellen om uit te zenden op basis van X-kanaal enz. Hiermee kunt u een socket.io-server in clustermodus laten werken, maar zoals u al zei, kan deze tekortschieten wanneer u moet houden dingen volgen die niet alleen een uitzending zijn.

Dus waar laat dit ons.. Wel, je kunt aangepaste haken gebruiken via socket.io-redis, maar persoonlijk vond ik het erg moeilijk te begrijpen en te gebruiken en had persoonlijk beperkt succes. Ik denk dat er met de nieuwe versie van socket.io en socket.io redis enkele aanpassingen waren om dit eenvoudiger te maken, maar ik heb ze niet geprobeerd.

In plaats daarvan gebruiken we redis hset en jget om de socket en een ID van een gebruiker op te slaan, en wanneer we alle gebruikers online willen krijgen, kunnen we redis opvragen om de lijst met online gebruikers of gebruikers in een specifieke kamer enz.

Wat u wilt doen, is het redis-pakket toevoegen en aansluiten op de reguliere pub / sub.

Dan, wanneer een gebruiker lid wordt van een kamer of je server, doe je een hset. Op de eerste join ziet de onze er ongeveer zo uit

redis.hset([collection-name],[Field],[value])

Dus in code ziet het eruit als

redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)

Dit stelt een waarde in redis in, dus de collectienaam is een waarde ( voor ons is het een unieke id van het kanaal ) en dan bewaren we de 'socket.id' voor het veld samen met een 'bijnaam' voor de waarde. Deze waarde is de gebruikers-ID OF het is anoniem als ze niet zijn ingelogd

Als we dan willen pakken wie er in een kamer is, gebruiken we het hget-commando

redis.HGETALL([collection-name],function(err,results){}

Dus binnenin, bijvoorbeeld de emit, noemen we de opdracht redis.HGETALL om alle items in een specifieke verzameling die we doorgeven te krijgen en die terug te sturen naar alle verbonden gebruikers.




  1. Hoe verwijder je alle documenten uit een collectie met Mongoose?

  2. Mongo bulksgewijs zoeken en bijwerken van overeenkomende documenten in één zoekopdracht?

  3. MongoDB Upsert uitgelegd

  4. Mongodb $lookup Werkt niet met _id