Frage

Vor kurzem lerne ich redis und ehrlich sehr beeindruckt und sterben, es zu benutzen. Eines der Dinge, die mich immer stört ist „wie Abfrage ich Redis“. Um genau zu sein Ich zu lösen versuchen folgende

Sprich ich habe ein Millionen Hashes gespeichert, wie unter

usage:1 = {created: 20100521, quantity:9, resource:1033, user:1842, ...}
usage:2 = {created: 20100812, quantity:3, resource:7233, user:1842, ...}
usage:3 = {created: 20100927, quantity:4, resource:1031, user:76, ...}

Bitte beachten Sie, dass es viele Schlüssel in Hashes ich nur 4 gezeigt haben. Nun, da ich Aufzeichnungen in bestimmten Datumsbereich finden möchten, indem Benutzer, durch Ressource oder für einen Benutzer in bestimmten Zeitraum.

Ich vermute, dass es redis spezifische Muster solcher Daten abzurufen. Ich bin ein Python-Programmierer. Ich habe Blick auf redisco (Ohm-Port), die einige Quering unterstützt, aber ich bin nicht sicher, ob es funktioniert, alle Daten erhalten und filtert dann in Python.

War es hilfreich?

Lösung

Für Redis, ist es am besten zu verstehen, welche Art von Abfragemuster Sie wollen über Ihre Daten, bevor Sie entscheiden, wie du gehst, es zu speichern.

Zum Beispiel, wenn Sie einen Datumsbereich Abfrage über einen Satz von Daten tun mögen, können Sie diese Daten als sortierte Satz speichern, wo die Schlüssel sind die Datenelemente Sie abfragen über wollen, und das Ergebnis ist ein Unix-Zeitstempel .

In Ihrem Beispiel oben, ich Ihr Beispiel Hash speichern könnte als:

 user_to_resource:i = user:j                   # key -> value forward map
 resources => (resource:i, created_timestamp)  # sorted set
 count_resource:i = quantity                   # key -> value quantity map

Das heißt, ich je viele Vorwärts- und Rückwärts Karten haben würde auf die Abfragemuster ich Unterstützung möchten.

Andere Tipps

die Abfragen, die Sie erwähnen, sind sehr zeitabhängig. In diesem Fall würden Sie klug sein, eine sortierte Menge zu verwenden. Sie könnten den Datetime-Stempel als die Partitur für jeden Eintrag verwenden.

Zum Beispiel könnten Sie wie folgt vor:

hmset usage:1 created 20100521 quantity 9 resource 1033 user 1842
hmset usage:2 created 20100812 quantity 3 resource 7233 user 1842
hmset usage:3 created 20100927 quantity 4 resource 1031 user 76

zadd usage 20200521 1
zadd usage 20100812 2
zadd usage 20100927 3

alles abzurufen:

sort usage get 
# get usage:*->created get usage:*->quantity get usage:*->resource get usage:*->user

oder

lrange usage 0 -1

Um die Indizes einer Reihe zu bekommen:

zrangebyscore usage 20100800 20100900

Für Abfragen auf einem Hash-Schlüssel-Wert basieren, gibt es eine sinnvolle Ergänzung zu redis, die die Verwendung von Skripten geschrieben in lua ermöglicht. Man könnte leicht ein einfaches Lua Script innerhalb eines Python heredoc und verwenden Sie die redis.eval Methode zu übergeben, das Skript zu redis schreiben. Das Skript könnte eine Schleife sein, die basierend auf dem Wert-Filter Sie suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top