2011-10-28 45 views
5

我被告知在我的Heroku应用程序中使用Redis存储经过身份验证的用户,所以我决定今天跳过。我想要做的就是在Redis的店里像这样的用户的商店散列:通过Redis键/值内的多个值进行搜索

{ 
    id:4532143215432, 
    username:'davejlong', 
    email:'[email protected]' 
} 

然后,我希望能够通过任何用户名或ID进行搜索。不知怎的,这对Redis来说可能吗?

我使用的支持任何redis的命令https://github.com/mranney/node_redis

回答

2

@orangeoctopus usecae中几乎没有问题。

Redis的127.0.0.1:6379> HMSET编号:4532143215432用户名davejlong​​ [email protected]​​.com OK Redis的127.0.0.1:6379> HMSET用户:davejlong​​ ID 4532143215432电子邮件[email protected]​​.com OK

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

所以,我更喜欢这种

SET user:davejlong 1 
HMSET user:1 username davejlong email [email protected] 

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)在标识

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

我用“更紧凑的方式来做这个......”,但却懒得打出来。 +1 –

+0

@philpirozhkov哪一个... –

+0

对不起,我错过了这一点,因为你没有增加通过邮件查找的能力。 'SET用户:[email protected]​​.com 1' 你可以通过邮件找到 –

3

这是为存储每个用户的两倍一样简单的node.js redis的模块。一次使用id的钥匙,一次使用用户名的钥匙。

一个更紧凑的方式来做这个内存方面是有用户名键到id,所以你的用户名查询会喜欢:按用户名查询,获取ID;放入ID,获取信息。

不幸的是,没有一种很好的方法可以通过两个不同的键来键入相同的实际数据。


例如,当你插入一个新的用户,然后查询它:

redis 127.0.0.1:6379> HMSET id:4532143215432 username davejlong email [email protected] 
OK 
redis 127.0.0.1:6379> HMSET user:davejlong id 4532143215432 email [email protected] 
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) "[email protected]" 
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。我现在也必须删除两个键。

+0

你能告诉我怎么会做,在CLI?我对所有这些redis的东西都是全新的,所以我不确定是否使用散列,列表等。 –

+0

我的答案已经更新了一个例子。 –

+0

您正在此处创建重复数据。考虑使用索引。 –