Recherche dans les valeurs d'un redis db
Je suis un novice dans l'utilisation de Redis DB. Après la lecture de certains de la documentation et de la recherche dans certains des exemples sur Internet et également la numérisation stackoverflow.com je peux voir que le Redis est très rapide, à des échelles bien mais cela coûte le prix que nous avons à penser à comment nos données seront accessibles au moment de la conception et les opérations qu'ils auront à subir. Ce que je peux comprendre, mais je suis un peu confus au sujet de la recherche dans les données, ce qui a été si facile, cependant lente, avec la plaine de vieux SQL. Je pourrais le faire dans un sens avec la TOUCHE de commande, mais c'est un O(N) opérations et non O(log(N)). Donc, je voudrais perdre l'un des avantages de Redis.
Ce que font leurs collègues plus expérimentés dire ici?
Prenons un exemple de cas d'utilisation: nous avons besoin de stocker des données personnelles pour env. 100.000 personnes et ces données doivent être recherchés par nom, n ° de téléphone.
Pour cela je voudrais utiliser les structures suivantes:
1. SET for storing all persons' ids {id1, id2, ...}
2. HASH for each person to store personal data and name it
like map:<id> e.g. map:id1{name:<name>, phone:<number>, etc...}
Solution 1:
1. HASH for storing all persons' ids but the key should be the phone number
2. Then with the command KEY 123* all ids could be retrieved who have a phone number
sarting with 123. On basis of the ids also the other personal data could be retrieved.
3. So forth for each data to be searched for a separate HASH should be created.
Mais un inconvénient majeur de cette solution est que l'attribut valeurs doit également être uniquede sorte que l'affectation du numéro de téléphone et l'id dans la table de HACHAGE serait sans équivoque. D'autre part, O(N) d'exécution n'est pas l'idéal.
En outreil utilise plus d'espace que ce qui serait nécessaire et le TOUCHE de commande détériore les performances d'accès. (http://redis.io/commands/keys)
Comment devrait-il être fait dans le droit chemin? Je pourrais aussi imaginer que les id irait dans un ZSET et les données nécessaires à la recherche pourrait être le les scores, mais ce seulement possible de travailler avec des gammes de pas avec seraches.
Je vous remercie également d'avance, cordialement, Tamas
Répondre résumé:
En fait, les deux réponses de l'état que le Redis n'a pas été conçu pour effectuer la recherche dans les valeurs des clés. Si ce cas d'utilisation est nécessaire, soit solutions doivent être mises en œuvre, comme indiqué dans ma solution originale ou dans le dessous de solution.
Ci-dessous solution par Eli a une bien meilleure performanceque mon original, car l'accès aux clés peut être considéré comme constant, seule la liste d'id doit être réitéré à travers, pour avoir accès, ce serait donner O(const) de l'exécution. Ce modèle de données permet également qu'une personne peut avoir le même numéro de téléphone que quelqu'un d'autre et ainsi de suite aussi pour les noms etc... donc 1-n relation est également possible (je dirais avec une vieille disquette de réparation d'urgence de la terminologie).
L'inconvénient de cette solution est que il consomme beaucoup plus d'espace que la mienne et les numéros de téléphone dont de départ chiffres sont connus seulement, n'a pas pu être fouillé.
Merci pour les deux réponses.
source d'informationauteur Tamas | 2013-06-19
Vous devez vous connecter pour publier un commentaire.
Redis est pour les cas d'utilisation où vous en avez besoin pour accéder et mettre à jour des données à très haute fréquence et où vous bénéficier de l'utilisation de structures de données (tables de hachage, les ensembles, listes, chaînes, ou des ensembles classés). C'est pour combler très des cas d'utilisation spécifiques. Si vous avez un cas comme très souple, à la recherche, vous seriez beaucoup mieux servi par quelque chose de construit à cette fin, comme elastic search ou SOLR.
Cela dit, si vous devez le faire dans le Redis, voici comment je le ferais (en supposant que les utilisateurs peuvent partager les noms et numéros de téléphone):
Dans ce cas, nous allons faire une nouvelle clé pour chaque nom (avec le préfixe "nom:") et chaque numéro de téléphone (avec préfixe de téléphone":"). Chaque points clés pour un ensemble d'identifiants qui ont toutes les infos que vous voulez pour un utilisateur. Lorsque vous effectuez une recherche, pour un de téléphone, par exemple, que vous allez faire:
et ensuite une boucle sur les résultats et de les retourner tout info sur chaque (nom dans notre exemple) dans la langue de votre choix (vous pouvez faire tout cela de côté serveur Lua sur le Redis boîte pour aller encore plus vite et d'éviter de réseau va-et-vient, si vous voulez):
Vous êtes ici sera
O(m)
oùm
est le nombre d'utilisateurs avec le numéro de téléphone, et ce sera une opération très rapide sur le Redis parce que de la façon dont optimisé, il est pour la vitesse. Ça va être exagéré dans votre cas parce que vous n'avez probablement pas besoin que les choses vont tellement vite, et vous préférez avoir de recherche flexible, mais c'est la façon dont vous le feriez.redis est génial, mais il n'est pas construit pour la recherche sur autre chose que des touches. Vous sont tout simplement pas de requête sur les valeurs sans renforcement supplémentaire des ensembles de données pour stocker les éléments afin de faciliter une telle interrogation, mais même alors, vous n'obtenez pas vrai de recherche, un peu plus d'entretien, une mauvaise utilisation de la mémoire, yada, yada...
Cette question a déjà été traitée, vous avez un peu de lecture à faire 😀
À la recherche des chaînes, construire l'auto-complétion dans le redis et d'autres choses cool...
Comment puis-je rechercher des chaînes dans le redis?
Pourquoi l'utilisation de MongoDB sur redis est intelligent lors de la recherche à l'intérieur de documents...
Quel est le plus efficace orientée document moteur de base de données pour stocker des milliers de moyennes documents?