sql >> データベース >  >> NoSQL >> Redis

すべてのクラスターでソケットセッションにアクセスする方法

    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コマンドを呼び出して、渡した特定のコレクション内のすべてのアイテムを取得し、接続されているすべてのユーザーに送り返します。




    1. AWSでMongoDBをホストするときに尋ねる(そして答える)10の質問

    2. SpringデータRedisHGETALL操作

    3. PHPアプリケーションからのページリクエストデータをログに記録するスケーラブルな方法は?

    4. pysparkデータフレームをredis用のazureキャッシュに書き込む方法はありますか?