【问题标题】:Redis + Node.js -- Loop over set membersRedis + Node.js -- 循环遍历集合成员
【发布时间】:2014-07-02 23:50:55
【问题描述】:

这里是我添加集合users 的地方。每个user 都有一个userID 和一个socketID

 socket.on('login', function(userID){
      console.log('io.sockets.on -- socket.on -- userID: ' + userID);
      console.log('socket.id = ' + socket.id);

      var user = userID;

      // add first user
      redis.sadd("users", user);
      redis.hmset(user, "socketID", socket.id, "userID", userID);  
    });    

这里是我试图检索集合中的所有users 并循环它们的地方:

    // Get the list of online users and show Presence
    redis.smembers("users", function(err,results) {

        var onlineUsers = results;

        console.log("onlineUsers = " + onlineUsers);

        for (var onlineUser in onlineUsers) {

            console.log("onlineUser = " + onlineUser);

            var userID = redis.hget(onlineUser,"userID", function(err,reply) {
                console.log("onlineUser hget: " + reply);
                data = JSON.parse(reply);
                console.log("data: " +data);

            });       
    });

这里是日志:

16:41:15 web.1  | onlineUsers = user:AuY0Uopq6X,user:YbgtwQs8Vt
16:41:16 web.1  | onlineUser = 0
16:41:16 web.1  | onlineUser = 1
16:41:16 web.1  | onlineUser hget: null
16:41:16 web.1  | data: null
16:41:16 web.1  | onlineUser hget: null
16:41:16 web.1  | data: null

我对 node-redis 以及如何简单地获取 userIDs 感到非常困惑。我知道它们在那里,因为 onlineUsers 包含它们,但是我在迭代中做错了!


编辑

我尝试使用redis-cli 并且密钥在那里:

redis 127.0.0.1:6379> SMEMBERS users
1) "user:AuY0Uopq6X"
2) "user:YbgtwQs8Vt"
redis 127.0.0.1:6379> HKEYS "user:AuY0Uopq6X"
1) "socketID"
redis 127.0.0.1:6379> 

使用上面的代码仍然没有运气。


编辑 - 已解决

我对如何设置和获取数据有疑问。我没有在“用户设置”的右键上设置“用户哈希”。这是正确的版本:

  var user = userID;

  // add first user
  redis.sadd("users", user);
  redis.hmset("users:"+user, "socketID", socket.id, "userID", userID);

但是,我还需要在获取用户哈希时实现 Philippe T 的更改。

【问题讨论】:

  • 你检查过你的hget命令回调中的err值是多少?
  • 16:56:26 web.1 |错误:空
  • 全部为空!我怀疑for (var onlineUser in onlineUsers) 没有给我onlineUser 的对象

标签: node.js redis node-redis


【解决方案1】:

我认为您是通过“用户”元素的索引而不是值来获取的,试试这个:

 // Get the list of online users and show Presence
redis.smembers("users", function(err,results) {

    var onlineUsers = results;

    console.log("onlineUsers = " + onlineUsers);

    for (var i in onlineUsers) {

        console.log("onlineUser = " + i);
        console.log("onlineUser = " + onlineUsers[i]);


        var userID = redis.hget(onlineUsers[i],"userID", function(err,reply) {
            console.log("onlineUser hget: " + reply);
            data = JSON.parse(reply);
            console.log("data: " +data);

        });       
});

【讨论】:

  • 好的。这很令人困惑。 results 是什么?不就是一组个人users吗?您在 for 循环中获取索引,但是当您将 onlineUsers[i] 传递给 hget 时,您最终会传递与我传递 onlineUser 时相同的 this,对吧?
  • 话虽如此,当我使用您的代码时,我确实从hget 获得了一个值...我只是想了解它为什么不同。
  • 当你在你的“for in”语句中迭代时,你有数组的索引。因此,要从名称中检索,您必须从数组中获取值并在 hget 上使用它。在你的代码中 i = onlineuser = 元素索引
  • 如果你有多个 client.multi()...iterate 和所有元素...client.execute(),你会怎么做
猜你喜欢
  • 1970-01-01
  • 2018-06-16
  • 2016-07-16
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
相关资源
最近更新 更多