Redis 客户端 - on('ready') 事件

Ale*_*lls 3 redis node.js node-redis

我正在使用 Node.js 的 Redis NPM 库 - 我可以像这样监听连接“就绪”事件

var client = require('redis').createClient();

client.on('ready', function () {
    client.keys('*', function (err, keys) {
        if (err) {
            log.error(err);
        } else {
            for (var i = 0; i < keys.length; i++) {
                createLocalDataMap(keys[i]);
            }
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,我如何查询 Redis 来查看它是否已准备好,而不是侦听在我准备好处理它之前可能会触发的事件?

我想我可以放弃就绪事件,只进行查询,然后等待响应,但是有没有更好、更安全、更复杂的方法呢?

换句话说,我很可能必须编写这样的函数:

var isReady = false;

client.on('ready', function(){

      isReady = true;
});

function doSomethingMuchLater(){

if(isReady){

     //query redis as normal
}
else {

   client.on('ready', function(){
   isReady = true;
     //now I do what I wanted to do
   });

}
}
Run Code Online (Sandbox Code Playgroud)

这似乎根本不对,必须有更好的方法

Ben*_*ied 7

在连接准备就绪之前,node-redis 客户端会自动将您发送的所有命令排队。连接后,这些命令都会在 .on('ready') 触发之前发送。因此,您确实不需要使用 .on('ready')。如果您太早发送命令,它们仍然会按预期进行,如果您的连接完全失败,它们将永远不会被发送。

  • 如果enable_offline_queue为假(默认为真),则这不是真的。在很多情况下可以禁用此选项,在这种情况下您的答案是不正确的。到时候你会怎么做呢? (3认同)
  • @RobertMennell - 我知道这是 5 年后的事,但要回答你的问题 - 如果你不想要离线队列,那么等待“ready”事件触发。您需要像OP建议的那样保持自己的状态(re:“isReady”),并且需要监听“error”和“end”事件来更新您的内部状态。您可以将所有这些包装在一个异步函数(promise)中,该函数会相应地解析或拒绝。这是很多样板文件,但如果您禁用离线队列,这就是您必须做的。 (2认同)