sql >> Databasteknik >  >> NoSQL >> Redis

hur man kommer åt socketsession i alla kluster

Socket.io-redis håller koll på ett sätt...

Från deras dokument

"Redis-adaptern utökar sändningsfunktionen för minnesadaptern:paketet publiceras också till en Redis-kanal (se nedan för formatet på kanalnamnet).

Varje Socket.IO-server tar emot detta paket och sänder det till sin egen lista över anslutna uttag."

Så i grund och botten används redis som mäklare för att tala om för varje socketserver att sända baserat på X-kanal etc. Så att du kan ha en socket.io-server i klusterläge som fungerar, men som du har nämnt kan den missa när du behöver behålla spåra saker utanför bara en emit.

Så var lämnar detta oss .. Jo du kan använda anpassade krokar via socket.io-redis men personligen tyckte jag att det var riktigt svårt att förstå och använda och hade begränsad framgång personligen. Jag tror att med den nya versionen av socket.io och socket.io redis fanns det några justeringar för att göra detta enklare men jag har inte provat dem.

Istället, vad vi gör är att använda redis hset och jget för att lagra socket och ett ID för en användare, sedan när vi vill få alla användare online kan vi fråga redis för att få listan över onlineanvändare eller användare i ett specifikt rum etc.

Vad du vill göra är att lägga till redis-paketet och ansluta i tillägg till den vanliga puben/suben.

Sedan, när en användare går med i ett rum eller din server för den delen kommer du att göra en hset. Vid första anslutningen ser vårt ut ungefär så här

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

Så i koden ser det ut som

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

Detta kommer att ställa in ett värde i redis, så samlingsnamnet är ett värde (för oss är det ett unikt id för kanalen) sedan lagrar vi 'socket.id' för fältet tillsammans med ett 'smeknamn' för värdet. Detta värde är användarens ID ELLER det är anonymt om de inte är inloggade

Sedan, när vi vill ta tag i vem som är i ett rum använder vi kommandot hget

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

Så inuti säg emit anropar vi kommandot redis.HGETALL för att hämta alla föremål i en specifik samling som vi skickar in och skicka tillbaka det till alla anslutna användare.




  1. Fråga efter ett dokument och alla dess underdokument som matchar ett villkor i mongodb (med våren)

  2. Hur använder man MongoDB-transaktioner med Mongoose?

  3. MongoDB:Kan inte kanonisera frågan:BadValue Projection kan inte ha en blandning av inkludering och exkludering

  4. Varför ska jag stänga eller hålla Redis-anslutningar öppna?