Redis è per i casi d'uso in cui è necessario accedere e aggiornare i dati a una frequenza molto elevata e in cui si beneficia dell'uso di strutture di dati (hash, set, elenchi, stringhe o set ordinati). È fatto per riempire casi d'uso molto specifici. Se hai un caso d'uso generale come la ricerca molto flessibile, saresti molto meglio servito da qualcosa creato per questo scopo come la ricerca elastica o SOLR.
Detto questo, se devi farlo in Redis, ecco come lo farei (supponendo che gli utenti possano condividere nomi e numeri di telefono):
name:some_name -> set([id1, id2, etc...])
name:some_other_name -> set([id3, id4, etc...])
phone:some_phone -> set([id1, id3, etc...])
phone:some_other_phone -> set([id2, id4, etc...])
id1 -> {'name' : 'bob', 'phone' : '123-456-7891', etc...}
id2 -> {'name' : 'alice', 'phone' : '987-456-7891', etc...}
In questo caso, stiamo creando una nuova chiave per ogni nome (preceduto da "nome:") e ogni numero di telefono (prefisso "telefono:"). Ogni chiave punta a una serie di ID che contengono tutte le informazioni desiderate per un utente. Quando cerchi, ad esempio, un telefono, farai:
HGETALL 'phone:123-456-7891'
e quindi scorrere i risultati e restituire qualsiasi informazione su ciascuno (nome nel nostro esempio) nella lingua preferita (puoi fare tutto questo in Lua lato server sulla casella Redis per andare ancora più veloce ed evitare la rete back-and- avanti, se vuoi):
for id in results:
HGET id 'name'
Il tuo costo qui sarà O(m)
dove m
è il numero di utenti con il numero di telefono specificato e questa sarà un'operazione molto veloce su Redis a causa della sua ottimizzazione per la velocità. Sarà eccessivo nel tuo caso perché probabilmente non hai bisogno che le cose vadano così velocemente e preferiresti avere una ricerca flessibile, ma è così che lo faresti.