node.js - Redis + Node.js -- 循环集合成员

标签 node.js redis node-redis

这是我添加用户集的位置。每个用户都有一个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);  
    });    

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

    // 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以及如何简单地获取userID感到非常困惑。我知道它们在那里,因为 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 的更改。

最佳答案

我认为您是通过“用户”元素的索引而不是值来获取的,请尝试以下操作:

 // 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);

        });       
});

关于node.js - Redis + Node.js -- 循环集合成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24542864/

相关文章:

ruby-on-rails - 为什么这个代码块在 Rails.cache.fetch 之后执行

python - 使用 Celery 与 RQ 的优缺点

java - RedisCacheManager 设置过期一定时间

node.js - 当在该 channel 中发布新消息时如何将 Redis 消息发送到客户端

node.js - on exit 事件不会在 AWS Lambda 中触发

javascript - 如何使用 node.js 修复 Twilio 中无效的内容类型 header ?

node.js - 在 Mongoose 中按 id 删除

node.js - 将 Node-Geocoder 与 Typescript 结合使用

node.js - 在 node-redis 中取消阻塞请求的最佳方法是什么?

typescript - 在 Jest 测试中调用 new class() 后没有创建新的类实例