2011-10-28 44 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

您正在此處創建重複數據。考慮使用索引。 –