1

私は、socket.io にチャット アプリのキーと値 (ユーザー名とソケット ID) のペアを格納するために、redis サーバーを使用しています。

私が直面した問題は、同じユーザー名が異なるデバイスからログインできるため、異なるソケット ID を持つことです。SO 私は 1 つのユーザー名に対して socketIDs の配列を関連付ける必要があります。配列をキーに関連付けようとしましたが、配列の最初の要素のみを文字列として取得しているようです。以下は私のコードです

配列をキーに設定します。

var socketIDs = [];
            socketIDs.push(socket.id);
            client.set(username, socketIDs, function (err) {
                console.log("IN USERNAME EVENT" + username + ":" + socketIDs);
            });

キーから配列を取得する:

client.get(username, function (err, socketIDs) {
                var i = socketIDs.indexOf(socket.id);
                if (i != -1)
                {
                    socketIDs.splice(i, 1);
                }
                client.set(username, socketIDs, function (err) {
                    console.log(username + " DISCONNECTED");
                    socket.disconnect();
                });
            });

ユーザー名に関連付けられた値を取得しようとすると、最初に追加した配列形式ではなく、socketID を文字列として取得します。

これに対する修正はありますか?または、単一のキーに対して複数の値を保存するという私の要件にアプローチする最良の方法は何ですか?

4

1 に答える 1

4

listまたはを使用することをお勧めしsetます。list重複チェックが必要でない限り、私は a を使用します (必要な場合は a を使用しますset)。以下の例はすべてベースになっていますが、ここlistに相当するものを見つけることができます。set

新しいソケット ID の追加

client.lpush(username, socket.id, function(err) {
    console.log('Prepended new socket ID to list');
});

ユーザーのすべてのソケット ID の取得

client.lrange(username, 0, -1, function(err, socketIds) {
});

特定のソケット ID を削除する

client.lrem(username, socketId, 0, function(err) {
});

(私はあなたがnode_redislibを使用していると仮定しました)。

于 2013-07-31T14:25:17.113 に答える