Вопрос
Недавно я учусь 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 (OHM Port), который поддерживает некоторое место, но я не уверен, что он получает все данные, а затем фильтры в Python.
Решение
Для 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
То есть у меня будет много свободных и обратных карт в зависимости от узоров запросов, которые я хотел бы поддержать.
Другие советы
Запросы, которые вы упоминаете, сильно зависят от времени. В этом случае вы будете разумно использовать отсортированный набор. Вы можете использовать штамп DateTime в качестве оценки для каждой записи.
Например, вы можете сделать следующее:
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. Вы можете легко написать простой сценарий LUA в Python Heredoc и использовать метод Redis.eval для передачи сценария для Redis. Сценарий может быть циклом, который фильтры, основанные на значении, которое вы ищете.