2011-10-31 18 views
5

Vorrei memorizzare alcune informazioni come segue (nota, non sto sposata a questa struttura i dati a tutti, ma questo vi mostra il sottostante informazioni voglio conservare):Ricerca semplice per valore?

{ user_id: 12345, page_id: 2, country: 'DE' } 

In questi record, user_id è un campo unico, ma il page_id non lo è.

Vorrei tradurre questo in una struttura dati Redis, e mi piacerebbe essere in grado di eseguire ricerche efficienti come segue:

  • Per id_utente 12345, trovare il relativo paese.
  • Per page_id 2, trova tutti gli user_id relativi e i rispettivi paesi.

È possibile farlo in Redis? In tal caso, quali strutture di dati dovrei usare e come dovrei evitare la possibilità di duplicare i record quando li inserisco?

risposta

4

Sembra che siano necessari due tipi di chiave: un tasto HASH per memorizzare i dati dell'utente e una LISTA per ogni pagina che contiene un elenco di utenti correlati. Di seguito è riportato un esempio di come potrebbe funzionare.

Carica dati:

> RPUSH page:2:users 12345 
> HMSET user:12345 country DE key2 value2 

estrarre i dati:

# All users for page 2 
> LRANGE page:2:users 0 -1 

# All users for page 2 and their countries 
> SORT page:2:users By nosort GET # GET user:*->country GET user:*->key2 

Rimuovi utente dalla pagina:

> LREM page:2:users 0 12345 

Ripetere ottiene nel SORT per recuperare i valori aggiuntivi per l'utente.

Spero che questo aiuti, fammi sapere se c'è qualcosa che desideri chiarito o se hai bisogno di ulteriore assistenza. Raccomando anche di leggere l'elenco dei comandi e la documentazione disponibile allo redis web site, in particolare per quanto riguarda l'operazione SORT.

+0

Grazie - in realtà ho finito usando un HASH e un SET, piuttosto che una LISTA - ma buona risposta! – Richard

1

Poiché user_id è univoco e lo è anche per il paese, mantenerli in una semplice coppia chiave-valore. Quing per un utente è O (1) in tal caso ... Quindi, mantenere alcuni Redis sets, con chiave il page_id e membri tutti gli user_ids ..

+0

Grazie. La mia preoccupazione su questo è: cosa succede se si inserisce un nuovo utente nel valore-chiave, quindi * prima * è possibile aggiungere la voce impostata, il database non funziona? Quando ritorna, rimarrai con brutte informazioni di mezzo entrato. – Richard

+1

In tal caso, hai due opzioni: o mantenere un qualche tipo di stato nel codice client, in altre parole, esaminare il risultato che restituisce redis dopo ogni operazione e comportarsi di conseguenza in casi di errore, oppure utilizzare http: // redis. io/comandi # operazioni; – hymloth

+1

Penso che [Pipelining] (http://redis.io/topics/pipelining) sia una buona scelta –

Problemi correlati