使用 node-redis 获取多个密钥

Posted

技术标签:

【中文标题】使用 node-redis 获取多个密钥【英文标题】:Getting multiple keys using node-redis 【发布时间】:2013-05-14 14:12:30 【问题描述】:

我正在尝试从 redis 实例中获取一堆密钥。我正在使用节点redis。我正在使用循环:

for( var i=1; i<=num; ++i )
    client.get(key + ':' + num, function (err, reply) 
        obj[num] = reply;
    );

return obj;

obj 只是未定义。我觉得我可能遇到了问题,因为 get 显然是异步调用的。还有另一种方法可以实现这一目标吗?我应该将值存储在排序集中吗?

【问题讨论】:

obj 声明在哪里? 【参考方案1】:

我将根据编码接口和您的 cmets 冒险猜测 client.get() 是异步的。这意味着它会“稍后”调用传递给它的回调函数,而不是立即调用。因此,您不能使用同步编码模式来收集多次调用client.get() 的结果,因为当您的函数返回时,obj 中的结果尚不可用。因此obj 尚未填充结果。

如果您想知道多个异步调用何时完成,那么您必须以非常不同的方式编写代码。而且,结果只会在回调函数内部可用,而不是在函数末尾。

总的来说,我发现您的代码存在多个问题:

    client.get() 是异步的,所以当你的函数返回时它还没有完成 您可能应该在client.get() 调用中使用i,而不是num,这样每次通过for 循环都会生成不同的请求。 循环中i 的值必须在闭包中冻结,以保留它的值,以便在稍后调用的回调函数中使用。 如果 obj 实际上是未定义的,那可能是因为您没有将其初始化为空对象。

这是一种方法:

var obj = ;
var remaining = num;
for( var i=1; i<=num; ++i )
    // create a closure here to freeze the value of i in the callback
    (function(i) 
        client.get(key + ':' + i, function (err, reply) 
            obj[i] = reply;
            // see if all asynch calls are done yet
            --remaining;
            if (remaining === 0) 
                // all asynch calls to client.get() are done now
                // in here, you can use the obj object and the results put on it
            
        );
    )(i);

【讨论】:

是的,我认为这可能是一个异步问题。 i vs num 只是我在输入问题时犯的一个错误。您的解决方案效果很好,谢谢。

以上是关于使用 node-redis 获取多个密钥的主要内容,如果未能解决你的问题,请参考以下文章

Node_redis - 如何删除密钥?

将 node-redis 与 node 8 util.promisify 一起使用

使用 node-redis 删除 redis 中的键数组

Node-Redis:就绪检查失败 - 需要 NOAUTH 身份验证

Solana - 如何从 JavaScript / Node.js 中的本地密钥对获取帐户?

Node.js中使用Redis数据库