Redis
 sql >> Base de données >  >> NoSQL >> Redis

comment accéder à la session de socket dans tous les clusters

Socket.io-redis garde une trace dans un sens...

À partir de leurs documents

"L'adaptateur Redis étend la fonction de diffusion de l'adaptateur en mémoire :le paquet est également publié sur un canal Redis (voir ci-dessous pour le format du nom du canal).

Chaque serveur Socket.IO reçoit ce paquet et le diffuse vers sa propre liste de sockets connectés."

Donc, fondamentalement, redis est utilisé comme courtier pour dire à chaque serveur socket d'émettre en fonction du canal X, etc. Vous permettant d'avoir un serveur socket.io en mode cluster fonctionne, mais comme vous l'avez mentionné, il peut échouer lorsque vous devez garder suivi des choses en dehors d'une simple émission.

Alors, où cela nous mène-t-il... Eh bien, vous pouvez utiliser des crochets personnalisés via socket.io-redis, mais personnellement, j'ai trouvé que c'était vraiment difficile à comprendre et à utiliser et j'ai eu personnellement un succès limité. Je pense qu'avec la nouvelle version de socket.io et socket.io redis, il y avait quelques ajustements pour simplifier cela, mais je ne les ai pas essayés.

Au lieu de cela, nous utilisons redis hset et jget pour stocker le socket et l'identifiant d'un utilisateur, puis lorsque nous voulons mettre tous les utilisateurs en ligne, nous pouvons interroger redis pour obtenir la liste des utilisateurs en ligne ou des utilisateurs dans une pièce spécifique, etc.

Ce que vous voudrez faire, c'est ajouter le package redis et vous connecter en plus au pub/sub régulier.

Ensuite, lorsqu'un utilisateur rejoint une salle ou votre serveur d'ailleurs, vous ferez un hset. Sur la première jointure, la nôtre ressemble à ceci

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

Donc, dans le code, cela ressemble à

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

Cela définira une valeur dans redis, donc le nom de la collection est une valeur (pour nous, c'est un identifiant unique du canal), puis nous stockons le 'socket.id' pour le champ avec un 'nick-name' pour la valeur. Cette valeur est l'identifiant de l'utilisateur OU son anonymat s'il n'est pas connecté

Ensuite, lorsque nous voulons saisir qui se trouve dans une pièce, nous utilisons la commande hget

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

Ainsi, à l'intérieur de l'émission, nous appelons la commande redis.HGETALL pour obtenir tous les éléments d'une collection spécifique que nous transmettons et les renvoyons à tous les utilisateurs connectés.