Pergunta

Recentemente, estou aprendendo redis e honestamente muito impressionado e morrendo de vontade de usá -lo. Uma das coisas que continuam me incomodando é "como faço para consultar redis". Para ser específico, estou tentando resolver seguintes

Diga que tenho milhões de hashes armazenados como abaixo

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

Observe que existem muitas chaves em hashes que mostrei apenas 4. Agora que quero encontrar registros em um intervalo específico, por usuário, por recurso ou por um usuário em um período determinado.

Eu suspeito que existem padrões específicos do Redis para recuperar esses dados. Eu sou um programador Python. Eu olhei para o Redisco (porta ohm), que suporta algumas consultas, mas não tenho certeza se ele obtém todos os dados e depois filtra em Python.

Foi útil?

Solução

Para o Redis, é melhor entender que tipo de padrões de consulta você deseja sobre seus dados antes de decidir como o armazenar.

Por exemplo, se você deseja fazer uma consulta de intervalo de dados em um conjunto de dados, poderá armazenar esses dados como um conjunto classificado em que as chaves são os itens de dados que você deseja consultar e a pontuação é um registro de data e hora do Unix.

No seu exemplo acima, posso armazenar seu exemplo de hash como:

 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

Ou seja, eu teria muitos mapas avançados e reversos, dependendo dos padrões de consulta que eu gostaria de apoiar.

Outras dicas

As consultas que você mencionam são altamente dependentes do tempo. Nesse caso, você seria aconselhável usar um conjunto classificado. Você pode usar o carimbo DateTime como a pontuação para cada entrada.

Por exemplo, você pode fazer o seguinte:

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

Para recuperar tudo:

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

ou

lrange usage 0 -1

Para obter os índices de um intervalo:

zrangebyscore usage 20100800 20100900

Para consultas baseadas em um valor de chave de hash, há uma adição útil ao Redis, que permite o uso de scripts escritos em Lua. Você pode escrever facilmente um script Lua simples em um heredoc python e usar o método redis.eval para passar o script para o Redis. O script pode ser um loop que filtra com base no valor que você está procurando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top