【问题标题】:How to get the key from value in key/value pair in redis store client?如何从 redis 存储客户端的键/值对中的值中获取键?
【发布时间】:2013-04-25 13:24:47
【问题描述】:

我将用户名/SocketID 对存储在我的 socket.io 聊天应用程序的 redis 存储中。

当用户断开连接时,我需要从 redis 存储中删除用户名/socketID 对。我已经看到了如何从键中获取值,但从来没有从值中获取键。可能吗?或者无论哪种方式,我如何才能从值中删除键/值对。这是我的代码

用于在连接时添加到商店

socket.on('username', function (username) {

    client.set(username, socket.id, function (err) {
        console.log(username + ":" + socket.id);
    });

});

对于断开连接,客户端不知道何时会发生断开连接,这可能是由于失去互联网连接而发生的,但是当套接字断开连接时,它总是会触发“断开连接”事件。在这种情况下,我需要删除用户名/socketID 对。

socket.on('disconnect', function () {

// dont know the username??

    client.del(username, socket.id, function (err) {
        if (err)
            console.log(err);
        else {
            socket.disconnect();
            console.log(socket.id + " DISCONNECTED");
        }
    });
});

【问题讨论】:

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


    【解决方案1】:

    最简单的方法是存储对。一个是username/id,一个是id/username。所以无论你有什么信息,你都可以得到另一个,因此也可以得到另一个键/值对。

    【讨论】:

    • 谢谢,我确实采用了这个解决方案。但我希望有一个更直接的解决方案来解决这个问题。
    • 如果有索引(键)和数据(值)。您无法搜索没有索引的数据。或者您进行“表扫描”。这就是索引/数据的本质。
    【解决方案2】:

    我建议您将 socket.io Id 合并到密钥中,例如

    id:username
    

    那么你可以做这样的事情

    client.keys([socket.id + ':*'], function (err, result) {
        if (err){
            //handle in some way
        }
    
        for (var r in result) {
            var key = result[r];
    
            client.del(key, function(err, result){
                // handle in some way
            });
        }
    });
    

    【讨论】:

    • 我也必须从用户名中找到socketID。就像我也向其他用户发送消息一样,然后我检索给定用户名的 socket.id 并将消息发送到该 socketID 。所以我肯定需要一种方法来从价值和其他方式中了解关键。
    • 在这种情况下,请从 heinob 中查看上面的答案并存储两个密钥。我建议在斜杠上使用冒号,以更符合预期的 Redis 键格式
    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    相关资源
    最近更新 更多