我想从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的做事方法和语法有点困惑,所以我愿意接受任何建议。
答案 0 :(得分:2)
您需要的是将所有昵称存储在一个集合中,然后只需在设置键上调用smembers
或sscan
即可。
每当您注册新用户时,您都需要在任何地方添加用户,并将昵称按原样添加到名为users:names
的集合中。
也就是说,如果您使用以下代码致电smembers
或sscan
,您就可以正确完成任务:
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;如果您拥有一组所有用户名,则答案是如何使用这些命令的一个很好的示例。