2012-07-13 131 views
25

estoy usando claves hash para almacenar datos de usuario como:¿Cómo buscar en redis las claves hash?

hmset user:1 user_name lee age 21 
hmset user:2 user_name david age 25 
hmset user:3 user_name chris age 25 

necesito para buscar usuarios que tienen age = 25, name = lee. ¿Cómo hacer una búsqueda para un valor específico en un campo dado?

+0

Una página recientemente agregada en la documentación de Redis proporciona más información sobre [Indización secundaria con Redis] (http://redis.io/topics/indexes) y cubre este caso bajo los [Índices de no rango] (http : //redis.io/topics/indexes#non-range-indexes) sección. –

Respuesta

47

No puede. Redis es una tienda de valores-clave, no una base de datos relacional.

Para buscar datos específicos, debe compilar una ruta de acceso a estos datos. Por ejemplo, para que los usuarios tengan la edad = 25 años, debe crear un índice para asignar los valores de edad a los usuarios. Se puede hacer con un conjunto. Esto es lo mismo para el nombre.

Una vez que tenga los conjuntos por edad y nombre, puede buscar usuarios mediante la intersección de los conjuntos. Por ejemplo:

# Add 3 users 
hmset user:1 user_name lee age 21 
hmset user:2 user_name david age 25 
hmset user:3 user_name chris age 25 

# Maintain age index 
sadd age:21 1 
sadd age:25 2 3 

# Maintain name index 
sadd name:lee 1 
sadd name:david 2 
sadd name:chris 3 

# Get the ID of users having age = 25 and name = lee 
sinter age:25 name:lee 
    -> will return an empty set 
+0

Estoy enfrentando el mismo problema de diseño, pero mi pregunta es después del comando "sinter age: 25 name: lee", el resultado debería ser una lista de id. Entonces necesito consultar por segunda vez para obtener los datos reales del usuario. ¿Es esta la única manera de hacerlo? –

+4

Si desea realizar una ida y vuelta única, una secuencia de comandos Lua del lado del servidor hará lo que desee (es decir, sinterización y, a continuación, un hgetall por elemento seleccionado). –

+0

No tiene sentido mantener el HASH en sí porque ya está almacenando el índice inverso para todos los campos HASH. – droidlabour

2

acually usted puede hacerlo con los valores de venta en clave

HMSET lee:25 user_name lee age 25 
HMSET massi:43 user_name massi age 43 
HMSET lee:24 user_name lee age 24 
HMSET lee:28 user_name lee age 28 city Berlin 

Ahora se puede encontrar con el comando "claves"

127.0.0.1:6379> keys *:25 
1) "lee:25" 
127.0.0.1:6379> keys lee* 
1) "lee:25" 
2) "lee:24" 
3) "lee:28" 
127.0.0.1:6379> keys massi:43 
1) "massi:43" 

Por último hallazgo hashes específicos

127.0.0.1:6379> HGETALL lee:24 
1) "user_name" 
2) "lee" 
3) "age" 
4) "24" 

Todo lo que dije es tha t puede hacerlo en dos pasos ponga cualquier cantidad de valores que necesite en la clave y luego encuéntrelos. Pero considere que no es una buena idea poner todos los valores dentro de la clave. Solo ponga aquellos con los que debe filtrar. Saludos :)

+0

Si bien esto puede funcionar, realmente recomendaría que no se construya algo serio. En los documentos de Redis, hay una advertencia específica contra el uso del comando KEYS en un entorno de producción, ya que puede degradar el rendimiento en una base de datos grande: https://redis.io/commands/keys. – xiy

Cuestiones relacionadas