2010-09-27 2 views
8

Kürzlich lerne ich Redis und ehrlich gesagt sehr beeindruckt und sterben zu verwenden. Eines der Dinge, die mich belästigen, ist "Wie frage ich Redis". Um genau zu sein ich folgendeAbfrage in Redis

zu lösen versuche Sagen wir, ich habe eine 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 habe ich nur 4. nun gezeigt, dass ich will Suchen nach Datensätzen in einem bestimmten Datumsbereich, nach Benutzer, Ressource oder Benutzer in einem bestimmten Zeitraum.

Ich vermute, dass es redis spezifische Muster gibt, um solche Daten abzurufen. Ich bin ein Python-Programmierer. Ich habe mir redisco (ohm port) angeschaut, der ein wenig quälend unterstützt, aber ich bin mir nicht sicher, ob es alle Daten und dann Filter in python bekommt.

Antwort

10

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

Wenn Sie beispielsweise eine Datumsbereichsabfrage für eine Datengruppe durchführen möchten, können Sie diese Daten als sortierte Menge speichern, wobei die Schlüssel die Datenelemente sind, die Sie abfragen möchten, und die Bewertung ist ein Unix Zeitstempel.

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

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 haben viele nach vorn haben würde und Reverse-Karten auf dem Abfragemuster abhängig Ich unterstütze mag.

+1

Dachte, es wäre nützlich, dies zu teilen http://pythonik.blogspot.com/2010/11/redis-patterns-search.html Disclaimer: Zeiger auf meinen eigenen Blog – Shekhar

7

Die Abfragen, die Sie erwähnen, sind stark zeitabhängig. In diesem Fall wäre es ratsam, einen sortierten Satz zu verwenden. Sie können den Datums-/Zeitstempel als Wert für jeden Eintrag verwenden.

Zum Beispiel könnten Sie Folgendes tun:

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 basierend auf einem Hash-Schlüsselwert gibt es eine nützliche Ergänzung zu redis, die die Verwendung von in lua geschriebenen Skripten ermöglicht. Sie könnten einfach ein einfaches Lua-Skript in einem Python-Heredoc schreiben und die redisse.eval-Methode verwenden, um das Skript an redis zu übergeben. Das Skript könnte eine Schleife sein, die basierend auf dem gesuchten Wert filtert.