Redis est destiné aux cas d'utilisation où vous devez accéder et mettre à jour des données à une fréquence très élevée et où vous bénéficiez de l'utilisation de structures de données (hachages, ensembles, listes, chaînes ou ensembles triés). Il est fait pour répondre à des cas d'utilisation très spécifiques. Si vous avez un cas d'utilisation général comme la recherche très flexible, vous seriez bien mieux servi par quelque chose construit à cet effet comme la recherche élastique ou SOLR.
Cela dit, si vous devez le faire dans Redis, voici comment je procéderais (en supposant que les utilisateurs puissent partager des noms et des numéros de téléphone) :
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...}
Dans ce cas, nous créons une nouvelle clé pour chaque nom (préfixé par "nom :") et chaque numéro de téléphone (préfixé par "téléphone :"). Chaque clé pointe vers un ensemble d'identifiants contenant toutes les informations souhaitées pour un utilisateur. Lorsque vous recherchez, pour un téléphone, par exemple, vous ferez :
HGETALL 'phone:123-456-7891'
puis parcourez les résultats et renvoyez les informations sur chacun (nom dans notre exemple) dans la langue de votre choix (vous pouvez faire tout cela en Lua côté serveur sur la boîte Redis pour aller encore plus vite et éviter les allers-retours réseau suite, si vous le souhaitez) :
for id in results:
HGET id 'name'
Votre coût ici sera O(m)
où m
est le nombre d'utilisateurs avec le numéro de téléphone donné, et ce sera une opération très rapide sur Redis en raison de son optimisation pour la vitesse. Ce sera exagéré dans votre cas car vous n'avez probablement pas besoin que les choses aillent si vite et vous préféreriez avoir une recherche flexible, mais c'est ainsi que vous le feriez.