2010-09-27 39 views
8

Recientemente estoy aprendiendo redis y sinceramente estoy muy impresionado y moribundo por usarlo. Una de las cosas que me sigue molestando es "cómo consulto el redis". Para ser más específicos que estoy tratando de resolver los siguientesConsultando en redis

decir que tengo un millones de hashes almacenados como a continuación

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

Tenga en cuenta que hay muchas llaves en los hashes que han mostrado sólo 4. Ahora que yo quiero para encontrar registros en un rango de fechas específico, por usuario, por recurso o para un usuario en un período determinado.

Sospecho que hay patrones específicos de redis para recuperar dichos datos. Soy un programador de Python. Miré a redisco (ohm port) que admite algunas búsquedas, pero no estoy seguro de si obtiene todos los datos y luego filtra en python.

Respuesta

10

Para Redis, es mejor entender qué tipo de patrones de consulta desea sobre sus datos antes de decidir cómo va a almacenarlos.

Por ejemplo, si desea hacer una consulta de intervalo de fechas sobre un conjunto de datos, puede almacenar esos datos como un conjunto ordenado donde las claves son los elementos de datos que desea consultar, y la puntuación es unix marca de tiempo

En el ejemplo anterior, podría almacenar su ejemplo 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 

Es decir, tendría muchas adelante y mapas en función de los patrones de consulta que me gustaría apoyar a la inversa.

+1

Pensé que sería útil compartir esto http://pythonik.blogspot.com/2010/11/redis-patterns-search.html Descargo de responsabilidad: Puntero a mi propio blog – Shekhar

7

las consultas que menciona dependen en gran medida del tiempo. En este caso, sería prudente utilizar un conjunto ordenado. Puede usar el sello de fecha y hora como puntaje para cada entrada.

Por ejemplo, se puede hacer lo siguiente:

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 todo:

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

o

lrange usage 0 -1 

para obtener los índices de una gama:

zrangebyscore usage 20100800 20100900 

Para consultas basadas en un valor de clave hash, hay una adición útil a redis que permite el uso de scripts escritos en lua. Puede escribir fácilmente un script lua simple dentro de python heredoc y usar el método redis.eval para pasar el script a redis. La secuencia de comandos podría ser un ciclo que se filtra según el valor que está buscando.