sql >> Base de Datos >  >> NoSQL >> Redis

cómo acceder a la sesión de socket en todos los clústeres

Socket.io-redis realiza un seguimiento en cierto sentido...

De sus documentos

"El adaptador Redis amplía la función de transmisión del adaptador en memoria:el paquete también se publica en un canal Redis (consulte a continuación el formato del nombre del canal).

Cada servidor Socket.IO recibe este paquete y lo transmite a su propia lista de sockets conectados".

Entonces, básicamente, redis se usa como intermediario para decirle a cada servidor de socket que emita en función del canal X, etc. Lo que le permite tener un servidor socket.io en modo clúster, pero como mencionó, puede quedarse corto cuando necesita mantener seguimiento de cosas fuera de solo una emisión.

Entonces, ¿dónde nos deja esto? Bueno, puede usar ganchos personalizados a través de socket.io-redis, pero personalmente encontré que era realmente difícil de entender y usar y personalmente tuve un éxito limitado. Creo que con la nueva versión de socket.io y socket.io redis hubo algunos ajustes para hacerlo más simple, pero no los he probado.

En cambio, lo que hacemos es usar redis hset y jget para almacenar el socket y la ID de un usuario, luego, cuando queremos que todos los usuarios estén en línea, podemos consultar redis para obtener la lista de usuarios en línea o usuarios en una sala específica, etc.

Lo que querrá hacer es agregar el paquete redis y conectarse además al pub/sub regular.

Luego, cuando un usuario se una a una sala o a su servidor, hará un hset. En la primera unión, el nuestro se parece a esto

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

Así que en el código parece

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

Esto establecerá un valor en redis, por lo que el nombre de la colección es un valor (para nosotros es una identificación única del canal), luego almacenamos el 'socket.id' para el campo junto con un 'apodo' para el valor. Este valor es el ID de los usuarios O es anónimo si no han iniciado sesión

Luego, cuando queremos capturar quién está en una habitación, usamos el comando hget

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

Entonces, dentro de, digamos, emit, llamamos al comando redis.HGETALL para obtener todos los elementos dentro de una colección específica que pasamos y los enviamos a todos los usuarios conectados.