【问题标题】:Finding number of users online/offline with redis,nodejs使用redis,nodejs查找在线/离线用户数
【发布时间】:2017-04-10 18:48:12
【问题描述】:

我正在使用 socket.io、redis 来跟踪用户的在线/离线状态。在这里,我使用模式 hub_id 存储名称为键的用户数。我可以通过获取匹配 hub_ 模式的键的数量来获取用户数量。现在密钥具有在线或离线状态的价值。

我无法得到否。 for 循环外的用户在线或离线变量。

  app.get('/test', function(req, res) {
  client.keys('hub*', function (err, keys) {
    console.log(keys.length);
    for (var i=0; i<keys.length; i++){
    client.hgetall(keys[i], function(err, reply) {
    if(reply.status == "online"){
      onlinehub++;
    }
    else if(reply.status == "offline"){
      offlinehub++;
    }
  });
  }
    console.log(onlinehub +"-" +offlinehub)

    });
});

【问题讨论】:

  • 请注意,HGETALL 在服务器运行时会阻塞服务器 - 如果您的哈希很大,这可能需要一段时间......相反,您应该做的是保持计数器(在 Redis 中)您的离线/在线/任何用户,这样您就可以通过一次读取操作获得回复。

标签: node.js redis


【解决方案1】:

这里你不能在for循环之外访问onlinehubofflinehub是因为这些变量是在异步函数调用中更新的,即

client.hgetall(keys[i], function(err, reply) { //<-- this is callback function
if(reply.status == "online"){
  onlinehub++;
}
else if(reply.status == "offline"){
  offlinehub++;
}
console.log(onlinehub +"-" +offlinehub); //Put the log here and check if it is giving correct numbers?
});

因此,您只能在该异步回调函数中访问 onlinehubofflinehub 变量的更新值。现在,您必须在控制台上登录 0-0

要解决此问题,您可以查看以下代码

app.get('/test', function(req, res) {
    //Defined a callback function to know when counting on redis keys finished
    var onComplete = function() {
       console.log(onlinehub+"-"+offlinehub);
    };
    client.keys('hub*', function (err, keys) {
        console.log(keys.length);
        var taskToGo = keys.length;
        if(taskToGo==0){
           onComplete();
       }else{
          for (var i=0; i<keys.length; i++){
              client.hgetall(keys[i], function(err, reply) {
                  if(reply.status == "online"){
                    onlinehub++;
                  }
                  else if(reply.status == "offline"){
                      offlinehub++;
                  }
                  //Added this line 
                  if(--taskToGo==0){ 
                     onComplete();
                  }
                });
          }
       }
    });
});

您可以向async for loop in node.js寻求帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多