2012-07-13 22 views
25

Sto usando le chiavi di hash per memorizzare i dati dell'utente come:Come cercare in redis per le chiavi hash?

hmset user:1 user_name lee age 21 
hmset user:2 user_name david age 25 
hmset user:3 user_name chris age 25 

ho bisogno di cercare utenti che hanno age = 25, name = lee. Come fare una ricerca per un valore specificato in un dato campo?

+0

Una pagina aggiunta di recente nella documentazione di Redis fornisce ulteriori informazioni su [Indirizzamento secondario con Redis] (http://redis.io/topics/indexes) e copre questo caso sotto [Indici non di intervallo] (http : //redis.io/topics/indexes#non-range-indexes) sezione. –

risposta

47

Non è possibile. Redis è un archivio di valori-chiave, non un database relazionale.

Per cercare dati specifici, è necessario creare un percorso di accesso a questi dati. Ad esempio, per ottenere utenti con età = 25, è necessario creare un indice per mappare i valori di età agli utenti. Può essere fatto con un set. Questo è lo stesso per il nome.

Una volta impostati per età e nome, è possibile cercare gli utenti intersecando i set. Per esempio:

# Add 3 users 
hmset user:1 user_name lee age 21 
hmset user:2 user_name david age 25 
hmset user:3 user_name chris age 25 

# Maintain age index 
sadd age:21 1 
sadd age:25 2 3 

# Maintain name index 
sadd name:lee 1 
sadd name:david 2 
sadd name:chris 3 

# Get the ID of users having age = 25 and name = lee 
sinter age:25 name:lee 
    -> will return an empty set 
+0

Sto affrontando lo stesso problema di progettazione, ma la mia domanda è dopo il comando "sinter age: 25 nome: lee", il risultato dovrebbe essere la lista di id. Quindi ho bisogno di interrogare la seconda volta per ottenere i dati dell'utente reale. È questo l'unico modo per fare? –

+4

Se si desidera eseguire un singolo roundtrip, uno script Lua sul lato server farà ciò che si desidera (ovvero sinter e quindi un hgetall per elemento selezionato). –

+0

Non ha senso mantenere lo stesso HASH perché stai già memorizzando l'indice inverso per tutti i campi HASH. – droidlabour

2

acually si può fare con i valori put in chiave

HMSET lee:25 user_name lee age 25 
HMSET massi:43 user_name massi age 43 
HMSET lee:24 user_name lee age 24 
HMSET lee:28 user_name lee age 28 city Berlin 

Ora si possono trovare con il comando "chiavi"

127.0.0.1:6379> keys *:25 
1) "lee:25" 
127.0.0.1:6379> keys lee* 
1) "lee:25" 
2) "lee:24" 
3) "lee:28" 
127.0.0.1:6379> keys massi:43 
1) "massi:43" 

finalmente trovare gli hash specifici

127.0.0.1:6379> HGETALL lee:24 
1) "user_name" 
2) "lee" 
3) "age" 
4) "24" 

Tutto ciò che ho detto è tha Puoi farlo in due passi, mettere un numero qualsiasi di valori che ti servono in chiave e poi trovarli. Ma considera che non è una buona idea mettere tutti i valori nella chiave. Metti solo quelli con i quali devi fare il filtro. Saluti :)

+0

Anche se questo potrebbe funzionare, consiglierei assolutamente questo per costruire qualcosa di serio. Nei documenti Redis, esiste un avvertimento specifico sull'utilizzo del comando KEYS in un ambiente di produzione in quanto può degradare le prestazioni in un database di grandi dimensioni: https://redis.io/commands/keys. – xiy

Problemi correlati