在Redis中按多个值搜索键/值

5

我被告知在Heroku应用程序中使用Redis来存储经过身份验证的用户,因此我今天决定开始尝试。我想要做的是将用户的hash值存储在Redis存储中,就像这样:

{
   id:4532143215432,
   username:'davejlong',
   email:'dave@davejlong.com'
}

我希望能够通过用户名或ID进行搜索。Redis是否可能实现这一点?

我正在使用支持任何Redis命令的node.js redis模块https://github.com/mranney/node_redis

2个回答

3
很简单,只需将每个用户存储两次。一次使用id作为键,另一次使用username作为键。
更节省内存的方法是将用户名作为键绑定到id上,这样你查询用户名时会得到id,然后用id来获取信息。
不幸的是,无法将相同的数据使用两个不同的键进行索引。
例如,当您插入一个新用户并查询该用户时:
redis 127.0.0.1:6379> HMSET id:4532143215432 username davejlong email dave@davejlong.com
OK
redis 127.0.0.1:6379> HMSET user:davejlong id 4532143215432 email dave@davejlong.com
OK
redis 127.0.0.1:6379> HGET id:4532143215432 username
"davejlong"
redis 127.0.0.1:6379> HGET user:davejlong id
"4532143215432"
redis 127.0.0.1:6379> HMGET user:davejlong email id
1) "dave@davejlong.com"
2) "4532143215432"
redis 127.0.0.1:6379> DEL user:davejlong
(integer) 1
redis 127.0.0.1:6379> DEL id:4532143215432
(integer) 1

请注意,当我创建用户时,我使用了两次HMSET。现在,我可以针对用户名或ID进行查询。现在,我也必须删除这两个键。


你能展示一下我该如何在CLI中完成吗?我对Redis这些东西还很陌生,所以不确定是应该使用哈希、列表等。 - Dave Long
您在此处创建了重复数据。考虑使用索引。 - phil pirozhkov

3

@orangeoctopus使用中存在一些问题。

redis 127.0.0.1:6379> HMSET id:4532143215432 username davejlong emaildave@davejlong.com OK redis 127.0.0.1:6379> HMSET user:davejlong id 4532143215432 email dave@davejlong.com OK

这将造成重复,考虑添加新值以及删除和更新。

因此,我更喜欢这样做:

SET user:davejlong 1
HMSET user:1 username davejlong email dave@davejlong.com 

1)如果涉及用户名

 redis.get('user:davejlong',function(err,id){
     console.log('User Id of @davejlong: ' + id);
     redis.hgetall('user:'+id,function(err,user){
        console.log('User Data: ' + user);
     })
  })

2) 如果涉及到 Id

   redis.hgetall('user:1',function(err,user){
       console.log('User Data: ' + user);
    })

我曾暗示过“更紧凑的做法...”,但懒得打出来。+1 - Donald Miner
抱歉,我误解了您的意思,因为您没有添加通过电子邮件查找的功能。 SET user:dave@davejlong.com 1 而且您可以通过电子邮件地址进行查找。 - phil pirozhkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接