我被告知在我的Heroku应用程序中使用Redis用于存储经过身份验证的用户,所以我决定今天跳进去。我想要做的是在Redis商店中存储用户的哈希,如下所示:
{
id:4532143215432,
username:'davejlong',
email:'dave@davejlong.com'
}
然后我希望能够通过用户名或ID进行搜索。这有可能与Redis有所不同吗?
我正在使用node.js redis模块,该模块支持任何redis命令https://github.com/mranney/node_redis
答案 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);
})