2010-09-27 13 views
8

Ostatnio uczę się redis i szczerze pod wrażeniem i umierając, aby z niego skorzystać. Jedną z rzeczy, które ciągle mi przeszkadzają, jest "jak mogę zapytać o redis". Za szczególne Próbuję rozwiązać następującyQuerying in redis

że mam miliony skrótów zapisanych poniżej

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, ...} 

Należy pamiętać, że istnieje wiele klawisze skrótów Pokazałem tylko 4. Teraz chcę znaleźć rekordy w określonym zakresie dat, według użytkownika, zasobu lub użytkownika w danym okresie.

Podejrzewam, że istnieją specjalne schematy odzyskiwania danych. Jestem programistą Pythona. Spojrzałem na redisco (port om), który obsługuje pewne kwerendy, ale nie jestem pewien, czy to dostaję wszystkie dane, a następnie filtry w python.

Odpowiedz

10

W przypadku Redis najlepiej jest wiedzieć, jakiego rodzaju wzorce zapytania mają nad danymi, zanim zdecydujesz, w jaki sposób zamierzasz je przechowywać.

Na przykład, jeśli chcesz wykonać zapytanie o zakres dat w zestawie danych, możesz przechowywać te dane jako sortowany zestaw, w którym klucze są elementami danych, które chcesz przesłać, a wynik jest uniksem znak czasu.

W przykładzie powyżej, mogę zapisać przykładowy skrót jako:

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 

To znaczy, że mam wiele do przodu i do tyłu mapy w zależności od wzorców zapytań Chciałbym poprzeć.

+1

Pomyślałem, że warto byłoby udostępnić to http://pythonik.blogspot.com/2010/11/redis-patterns-search.html Zastrzeżenie: Wskaźnik do mojego własnego bloga – Shekhar

7

Zapytania, o których wspomniałeś, są bardzo zależne od czasu. W tym przypadku rozsądnie byłoby użyć sortowanego zestawu. Możesz użyć datetime pieczęć jako wynik dla każdego wpisu.

Na przykład, można wykonać następujące czynności:

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 

Aby pobrać wszystko:

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

lub

lrange usage 0 -1 

aby uzyskać indeksy zakresie:

zrangebyscore usage 20100800 20100900 

W przypadku zapytań opartych na wartości skrótu istnieje użyteczny dodatek do redis, który umożliwia korzystanie ze skryptów napisanych w lua. Możesz łatwo napisać prosty skrypt lua w pythonowym heredoc i użyć metody redis.eval, aby przekazać skrypt do redisu. Skrypt może być pętlą, która filtruje na podstawie wartości, której szukasz.