Запросы в Redis - PullRequest
       7

Запросы в Redis

8 голосов
/ 27 сентября 2010

В последнее время я изучаю Redis и, честно говоря, очень впечатлен и умираю, чтобы использовать его.Одна из вещей, которые меня беспокоят, это «как мне запросить redis».Если быть точным, я пытаюсь решить следующие вопросы:

Скажем, у меня хранятся миллионы хэшей, как показано ниже

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

Обратите внимание, что в хэшах есть много ключей, которые я показал только 4.что я хочу найти записи в определенном диапазоне дат, по пользователю, по ресурсу или по пользователю за указанный период.

Я подозреваю, что существуют определенные шаблоны redis для извлечения таких данных.Я программист на Python.Я посмотрел на redisco (ом-порт), который поддерживает некоторые запросы, но я не уверен, что он получает все данные и затем фильтрует в python.

Ответы [ 2 ]

10 голосов
/ 27 сентября 2010

Для Redis лучше понять, какие шаблоны запросов вам нужны для ваших данных, прежде чем вы решите, как вы собираетесь их хранить.

Например, если вы хотите выполнить запрос диапазона дат по набору данных, вы можете сохранить эти данные в виде отсортированного набора, где ключами являются элементы данных, к которым вы хотите запросить, а оценка равнавременная метка Unix.

В приведенном выше примере я могу сохранить ваш пример хэша как:

 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

То есть у меня будет много прямых и обратных карт в зависимости от шаблонов запросов, которые яхотел бы поддержать.

7 голосов
/ 25 мая 2011

упомянутые вами запросы сильно зависят от времени.В этом случае вам будет разумно использовать отсортированный набор.Вы можете использовать отметку даты и времени в качестве оценки для каждой записи.

Например, вы можете сделать следующее:

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

Чтобы получить все:

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

или

lrange usage 0 -1

Чтобы получить индексы диапазона:

zrangebyscore usage 20100800 20100900

Для запросов, основанных на значении хеш-ключа, есть полезное дополнение к redis, которое позволяет использовать написанные сценариив Луа.Вы можете легко написать простой скрипт на языке lua внутри python heredoc и использовать метод redis.eval для передачи скрипта в redis.Сценарий может быть циклом, который фильтрует на основе искомого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...