Socket.io-redis следи в известен смисъл...
От техните документи
„Адаптерът Redis разширява функцията за излъчване на адаптера в паметта:пакетът също се публикува в Redis канал (вижте по-долу за формата на името на канала).
Всеки Socket.IO сървър получава този пакет и го излъчва към свой собствен списък от свързани гнезда."
Така че по принцип, redis се използва като посредник, за да каже на всеки сокет сървър да излъчва въз основа на X канал и т.н. Позволява ви да имате socket.io сървър в режим на клъстер, но както споменахте, може да падне, когато трябва да поддържате проследяване на неща извън просто излъчване.
И така, къде ни оставя това.. Е, можете да използвате персонализирани куки чрез socket.io-redis, но лично аз открих, че е наистина трудно за разбиране и използване и имах ограничен успех лично. Мисля, че с новата версия на socket.io и socket.io redis имаше някои настройки, за да опростя това, но не съм ги пробвал.
Вместо това, това, което правим, е да използваме redis hset и jget за съхраняване на сокета и идентификатора на потребители, след което, когато искаме да вкараме всички потребители онлайн, можем да запитаме redis, за да получим списъка с онлайн потребители или потребители в конкретна стая и т.н.
Това, което ще искате да направите, е да добавите пакета redis и да се свържете в допълнение към обикновения pub/sub.
След това, когато потребител се присъедини към стая или вашия сървър, вие ще направите hset. При първото присъединяване нашето изглежда така
redis.hset([collection-name],[Field],[value])
Така че в код изглежда така
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
Това ще зададе стойност в redis, така че името на колекцията е стойност (за нас това е уникален идентификатор на канала), след което съхраняваме 'socket.id' за полето заедно с 'nick-name' за стойността. Тази стойност е идентификационният номер на потребителя ИЛИ е анонимен, ако не са влезли
След това, когато искаме да вземем кой е в стаята, използваме командата hget
redis.HGETALL([collection-name],function(err,results){}
Така че вътре в, да речем, emit, ние извикваме командата redis.HGETALL, за да получим всички елементи в конкретна колекция, която предаваме и да ги изпратим обратно на всички свързани потребители.