【问题标题】:Turn redis keys into javascript object?将redis键变成javascript对象?
【发布时间】:2016-02-27 14:40:29
【问题描述】:

我想从 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 的做事方式和语法有点困惑,所以我愿意接受任何建议。

【问题讨论】:

  • 如果您在应用程序代码中使用KEYS(或者,在您的情况下为redisSessionClient.keys),请为痛苦的世界做好准备。
  • 好吧,很高兴知道...我实际上并没有使用它,只是为了我正在玩的一个测试用户登录系统。
  • @MichaelJosephAubry 检查我新添加的答案。你选择的那个是非常非常错误的。正如Itama所说,你不能在应用程序代码上使用keys命令!!!!!!!!!

标签: javascript json string redis


【解决方案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 万个键,但其中只有 20 万个键具有 users: 前缀,那么使用 keys 获取所有用户名的列表实际上浪费了 80 万次操作。这是一项代价高昂的操作,可能会对您的生产应用程序的性能产生重大影响。

如果您有一组所有用户名,Matias 的回答就是如何使用这些命令的一个很好的例子。

【讨论】:

  • 这个答案是错误的。 keys 不得在应用程序代码中使用。
  • 同意,在生产环境中推荐密钥是错误的做法。
  • 不会降低答案的正确性,尤其是考虑到他已经在示例中使用了keys。此外,上述 OP 的评论指出这是来自非生产测试。事实上,在 Redis 上编写/运行独立查询时,我一直使用keys
  • OP 和其他读者访问 SO 是因为他们想学习技术。我没有找到强有力的论据。事实上,这个命令的问题不在于它的复杂性,而在于它的阻塞性。
  • 我会完全放弃这个答案,因为它为我们提供了一个非常错误的开发模式。整个命令是为了在 Redis CLI 中用于维护目的......
【解决方案2】:

您需要将所有昵称存储在一个集合中,然后在集合键上调用smemberssscan

每当您注册新用户时,您都需要将您的用户添加到任何您想要的位置,并将昵称​​按原样添加到名为的集合中,例如 users:names。 p>

也就是说,如果你使用下面的代码调用smemberssscan,你就会把事情做好:

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

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

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

【讨论】:

  • 谢谢你,我喜欢学习 Redis,这个项目只是我在玩弄它。我将 MongoDB 用于真实的东西,但我想有效地使用两者!
猜你喜欢
  • 2021-04-12
  • 2017-11-19
  • 2012-09-21
  • 2011-08-29
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多