men jag förstår inte hur det skulle vara annorlunda att använda RedisStore i den koden från att använda MemoryStore. Kan någon förklara det för mig?
Skillnaden är att när du använder standard MemoryStore
, kommer alla meddelanden som du sänder ut i en arbetare endast att skickas till klienter som är anslutna till samma arbetare, eftersom det inte finns någon IPC mellan arbetarna. Använda RedisStore
, kommer ditt meddelande att publiceras på en redis-server, som alla dina medarbetare prenumererar på. Således kommer meddelandet att plockas upp och sändas av alla arbetare och alla anslutna klienter.
Och vad är skillnaden mellan att konfigurera socket.io för att använda redisstore kontra att skapa din egen redis-klient och ställa in/hämta din egen data?
Jag är inte så bekant med RedisStore
, och så jag är inte säker på alla skillnader. Men att göra det själv skulle vara en helt giltig praxis. I så fall kan du publicera alla meddelanden till en redis-server och lyssna på dem i din sockethanterare. Det skulle förmodligen vara mer jobb för dig, men du skulle också ha mer kontroll över hur du vill ställa in det. Jag har själv gjort något liknande:
// 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();
});
});
Detta innebär också att du själv måste ta hand om mer avancerad meddelandedirigering, till exempel genom att publicera/prenumerera på olika kanaler. Med RedisStore
, du får den funktionen gratis genom att använda socket.io-kanaler (io.sockets.of("channel").emit(...)
).
En potentiellt stor nackdel med detta är att socket.io-sessioner inte delas mellan arbetare. Detta kommer förmodligen att innebära problem om du använder någon av de långa röstningstransporterna.