2011-10-28 16 views
5

Mi è stato detto di utilizzare Redis per gli utenti autenticati del negozio nella mia applicazione su Heroku, così ho deciso di saltare oggi. Quello che voglio fare è memorizzare hash di utenti nel negozio Redis come questo:Ricerca per più valori all'interno di una chiave/valore redis

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

e poi voglio essere in grado di eseguire la ricerca tramite il nome utente o ID. Questo è possibile con Redis in qualche modo?

Sto usando il modulo Redis Node.JS che supporta qualsiasi Redis comando https://github.com/mranney/node_redis

risposta

2

Ci sono pochi problemi nell'usecae @orangeoctopus.

Redis 127.0.0.1:6379> HMSET ID: 4.532.143,215432 millions nome utente davejlong ​​[email protected] OK Redis 127.0.0.1:6379> utente HMSET: davejlong ​​id 4.532.143,215432 millions email [email protected] OK

Ciò farà la duplicazione, penserà all'aggiunta di nuovi valori e all'eliminazione dell'aggiornamento &.

quindi preferisco questo

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

1) In caso di nome utente

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) In caso di Id

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

Mi sono sfuggito a questo con "Un modo più compatto di fare questo ..." ma era troppo pigro per dartelo. +1 –

+0

@philpirozhkov quale uno ... –

+0

Scusa ho perso il punto dato che non stai aggiungendo la possibilità di trovare per posta. 'Utente SET: [email protected] 1' e si è in grado di trovare per posta –

3

E 'semplice come la memorizzazione di ogni utente due volte. Una volta con la chiave dell'ID e una volta con la chiave del nome utente.

Un modo più compatto di fare ciò in termini di memoria è avere la chiave di nomi utente per id, quindi la query del nome utente vorrebbe: query per nome utente, ottenere id; inserisci ID, ottieni informazioni.

Sfortunatamente, non c'è un buon modo per far digerire gli stessi dati reali con due chiavi diverse.


Ad esempio, quando si dovrebbe inserire un nuovo utente e quindi eseguire una query per esso:

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 

noti che quando sto creando l'utente, io uso HMSET due volte. Ora, posso interrogare sia il nome utente che l'id. Devo anche cancellare entrambi i tasti ora.

+0

Potrebbe mostrarmi come avrei fatto a la CLI? Sono nuovo di zecca per tutto questo materiale redis, quindi non sono sicuro se usare un hash, lista, ecc. –

+0

La mia risposta è stata aggiornata con un esempio. –

+0

Qui stai creando dati duplicati. Considera gli indici di utilizzo. –

Problemi correlati