在redis键/值内搜索多个值

时间:2011-10-28 18:39:49

标签: node.js redis

我被告知在我的Heroku应用程序中使用Redis用于存储经过身份验证的用户,所以我决定今天跳进去。我想要做的是在Redis商店中存储用户的哈希,如下所示:

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

然后我希望能够通过用户名或ID进行搜索。这有可能与Redis有所不同吗?

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

2 个答案:

答案 0 :(得分:3)

就像将每个用户存储两次一样简单。一次使用id键,一次使用用户名密钥。

在内存方面这样做的一种更紧凑的方法是让用户名键为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。我现在也必须删除这两个键。

答案 1 :(得分:2)

@orangeoctopus usecae中几乎没有问题。

  

redis 127.0.0.1:6379> HMSET号码:4532143215432用户名davejlong​​ emaildave@davejlong​​.com   好   redis 127.0.0.1:6379> HMSET用户:davejlong​​ id 4532143215432电子邮件dave@davejlong​​.com   行

这将重复,考虑添加新值并删除&更新

所以我更喜欢这个

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