Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Beispiele für die Verwendung von RedisStore in socket.io

aber ich verstehe nicht, wie sich die Verwendung von RedisStore in diesem Code von der Verwendung von MemoryStore unterscheiden würde. Kann mir das jemand erklären?

Der Unterschied besteht darin, dass bei Verwendung des standardmäßigen MemoryStore , wird jede Nachricht, die Sie in einem Worker ausgeben, nur an Clients gesendet, die mit demselben Worker verbunden sind, da zwischen den Workern kein IPC besteht. Verwenden des RedisStore , wird Ihre Nachricht auf einem Redis-Server veröffentlicht, den alle Ihre Mitarbeiter abonnieren. Somit wird die Nachricht von allen Workern und allen verbundenen Clients abgeholt und gesendet.

Was ist auch der Unterschied zwischen der Konfiguration von socket.io zur Verwendung von Redisstore und der Erstellung Ihres eigenen Redis-Clients und dem Festlegen/Abrufen Ihrer eigenen Daten?

Ich bin mit RedisStore nicht genau vertraut , und deshalb bin ich mir nicht sicher über alle Unterschiede. Aber es selbst zu tun, wäre eine vollkommen gültige Praxis. In diesem Fall könnten Sie alle Nachrichten auf einem Redis-Server veröffentlichen und diese in Ihrem Socket-Handler abhören. Es wäre wahrscheinlich mehr Arbeit für Sie, aber Sie hätten auch mehr Kontrolle darüber, wie Sie es einrichten möchten. Ich habe selbst etwas Ähnliches gemacht:

// 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();
  });
});

Das bedeutet auch, dass Sie sich selbst um ein erweitertes Nachrichten-Routing kümmern müssen, indem Sie beispielsweise verschiedene Kanäle veröffentlichen/abonnieren. Mit RedisStore , erhalten Sie diese Funktionalität kostenlos, indem Sie socket.io-Kanäle verwenden (io.sockets.of("channel").emit(...) ).

Ein potenziell großer Nachteil dabei ist, dass socket.io-Sitzungen nicht zwischen Arbeitern geteilt werden. Dies wird wahrscheinlich zu Problemen führen, wenn Sie einen der Long-Polling-Transporte verwenden.