将redis键转换为javascript对象?

时间:2015-11-24 23:27:49

标签: javascript json string redis

我想从redis中获取所有用户并将其传递到我的模板中。

我收到的是像['users:nick','users:mike']

这样的数组

我不想要正则表达式,我想取用户名并将其存储在对象数组[{username: 'nick'}]

redisSessionClient.keys("users:*", function(err, users) {
  if(err) {
    console.log(err);
    return;
  }

  for (i = 0; i < users.length; i++) {
    console.log(users[i])
  }

  res.render('chat', req.user);
});

我认为我对redis的做事方法和语法有点困惑,所以我愿意接受任何建议。

2 个答案:

答案 0 :(得分:2)

您需要的是将所有昵称存储在一个集合中,然后只需在设置键上调用smemberssscan即可。

每当您注册新用户时,您都需要在任何地方添加用户,并将昵称​​按原样添加到名为users:names的集合中。

也就是说,如果您使用以下代码致电smemberssscan,您就可以正确完成任务:

redisSessionClient.smembers('users:names', function(err, userNames) {
  var newArray = userNames.map(function(userName) {
    return {
      username: userName
    };
  });
});

在一天结束时,您需要在使用Redis时改变主意:如果您需要获取某些实体的某些属性值,那么您需要单独存储这些值并获取它们。这就像使用原始索引一样。

无论如何,看看scan-based commands进一步,甚至更好的方法。在简单的情况下,而不是大数据库,smembers应该没问题。

答案 1 :(得分:1)

Redis使用字符串作为键,因此您只需解析它:

redisSessionClient.keys('users:*', function(err, users) {
  var newArray = users.map(function(user) {
    return {
      username: user.split(':')[1]
    };
  });

  // newArray is what you wanted
});

修改:看到这个答案被接受后,我会回应每个人对于为什么在生产中使用keys不合适的担忧。

要查询Redis中的所有键需要O(n)时间,其中n是您存储的键的总数。因此,如果您有100万个密钥,但这些密钥中只有200k具有users:前缀,那么您通过使用keys来获取所有用户名列表,实际上浪费了800k操作。这是一项昂贵的操作,可能会对您的生产应用产生重大的性能影响。

的Matias&#39;如果您拥有一组所有用户名,则答案是如何使用这些命令的一个很好的示例。