如何将数组存储在redis服务器的Key值对的值中?

时间:2013-07-31 12:38:07

标签: node.js dictionary redis socket.io key-value

我正在使用redis服务器为socket.io中的聊天应用程序存储键值(username-socketID)对。

我遇到的问题是相同的用户名可以从不同的设备登录,因此将具有不同的套接字ID。所以我必须将一个socketID数组与一个用户名相关联。 我试图将数组与键相关联,但它似乎只将数组的第一个元素作为字符串。以下是我的代码

将数组设置为键:

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作为字符串而不是我最初添加的数组格式。

对此有何修复?或者什么是满足我为单个密钥存储多个值的要求的最佳方法?

1 个答案:

答案 0 :(得分:3)

我建议使用listset。除非您需要重复检查,否则我会使用list(如果是,请使用set)。以下所有示例均基于list,但您可以找到set here的等效项。

添加新的套接字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_redis lib。)