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

Exemples d'utilisation de RedisStore dans socket.io

mais je ne comprends pas en quoi l'utilisation de RedisStore dans ce code serait différente de l'utilisation de MemoryStore. Quelqu'un peut-il m'expliquer ?

La différence est que lors de l'utilisation du MemoryStore par défaut , tout message que vous émettez dans un worker ne sera envoyé qu'aux clients connectés au même worker, puisqu'il n'y a pas d'IPC entre les workers. Utiliser le RedisStore , votre message sera publié sur un serveur Redis auquel tous vos collaborateurs sont abonnés. Ainsi, le message sera capté et diffusé par tous les travailleurs, et tous les clients connectés.

Quelle est également la différence entre configurer socket.io pour utiliser redisstore et créer votre propre client redis et définir/obtenir vos propres données ?

Je ne connais pas intimement RedisStore , et donc je ne suis pas sûr de toutes les différences. Mais le faire soi-même serait une pratique parfaitement valable. Dans ce cas, vous pouvez publier tous les messages sur un serveur Redis et écouter ceux de votre gestionnaire de socket. Ce serait probablement plus de travail pour vous, mais vous auriez également plus de contrôle sur la façon dont vous voulez le configurer. J'ai moi-même fait quelque chose de similaire :

// Publishing a message somewhere
var pub = redis.createClient();
pub.publish("messages", JSON.stringify({type: "foo", content: "bar"}));

// Socket handler
io.sockets.on("connection", function(socket) {
  var sub = redis.createClient();
  sub.subscribe("messages");
  sub.on("message", function(channel, message) {
    socket.send(message);
  });

  socket.on("disconnect", function() {
    sub.unsubscribe("messages");
    sub.quit();
  });
});

Cela signifie également que vous devez vous occuper vous-même du routage des messages plus avancé, par exemple en publiant/en vous abonnant à différents canaux. Avec RedisStore , vous obtenez cette fonctionnalité gratuitement en utilisant les canaux socket.io (io.sockets.of("channel").emit(...) ).

Un inconvénient potentiellement important avec ceci est que les sessions socket.io ne sont pas partagées entre les travailleurs. Cela posera probablement des problèmes si vous utilisez l'un des transports à interrogation longue.