Socket.io-redisはある意味で追跡します。
ドキュメントから
「Redisアダプターは、メモリー内アダプターのブロードキャスト機能を拡張します。パケットは、Redisチャネルにも公開されます(チャネル名の形式については、以下を参照してください)。
各Socket.IOサーバーはこのパケットを受信し、接続されている独自のソケットのリストにブロードキャストします。」
したがって、基本的に、redisは、Xチャネルなどに基づいて各ソケットサーバーに送信するように指示するブローカーとして使用されます。クラスターモードでsocket.ioサーバーを機能させることができますが、前述のように、維持する必要がある場合は不十分になる可能性があります。排出物以外のものを追跡します。
それで、これはどこに私たちを残しますか..まあ、socket.io-redisを介してカスタムフックを使用できますが、個人的にはそれを理解して使用するのは非常に難しく、個人的には限られた成功しか収めていませんでした。新しいバージョンのsocket.ioとsocket.ioredisでは、これを簡単にするための調整がいくつかあったと思いますが、試したことはありません。
代わりに、redis hsetとjgetを使用してソケットとユーザーのIDを保存します。次に、すべてのユーザーをオンラインにしたい場合は、redisにクエリを実行して、オンラインユーザーまたは特定の部屋のユーザーのリストなどを取得できます。
やりたいことは、redisパッケージを追加し、追加で通常のpub/subに接続することです。
次に、ユーザーがそのことについて部屋またはサーバーに参加すると、hsetを実行します。最初の参加では、次のようになります
redis.hset([collection-name],[Field],[value])
したがって、コードでは次のようになります
redis.hset(decoded.cID,"socket-" + socket.id,socket.nickname)
これによりredisに値が設定されるため、コレクション名は値(私たちにとってはチャネルの一意のID)になり、フィールドの「socket.id」と値の「ニックネーム」がストックされます。この値は、ユーザーID、またはログインしていない場合は匿名です
次に、部屋にいる人を取得する場合は、hgetコマンドを使用します
redis.HGETALL([collection-name],function(err,results){}
つまり、emitの内部で、redis.HGETALLコマンドを呼び出して、渡した特定のコレクション内のすべてのアイテムを取得し、接続されているすべてのユーザーに送り返します。