2011-10-31 12 views
5

me gustaría para almacenar información como sigue (nota, no estoy casado con esta estructura de datos en absoluto, pero esto demuestra que el subyacente información Quiero guardar):¿Búsqueda simple por valor?

{ user_id: 12345, page_id: 2, country: 'DE' } 

En estos records, user_id es un campo único, pero el page_id no lo es.

me gustaría traducir esto en una estructura de datos Redis, y me gustaría ser capaz de ejecutar búsquedas eficientes de la siguiente manera:

  • Para user_id 12345, encontrar el país correspondiente.
  • Para page_id 2, encuentre todos los user_ids relacionados y sus países.

¿Es realmente posible hacer esto en Redis? De ser así, ¿qué estructuras de datos debería usar y cómo debería evitar la posibilidad de duplicar registros cuando los inserto?

Respuesta

4

Parece que necesita dos tipos de teclas: una tecla HASH para almacenar los datos de su usuario, y una LISTA para cada página que contiene una lista de usuarios relacionados. A continuación se muestra un ejemplo de cómo esto podría funcionar.

carga de datos:

> RPUSH page:2:users 12345 
> HMSET user:12345 country DE key2 value2 

extraer datos:

# All users for page 2 
> LRANGE page:2:users 0 -1 

# All users for page 2 and their countries 
> SORT page:2:users By nosort GET # GET user:*->country GET user:*->key2 

Eliminar usuario de la Página:

> LREM page:2:users 0 12345 

Repetir se interpone en el ORDENAR para recuperar valores adicionales para el usuario.

Espero que esto ayude, avíseme si hay algo que le gustaría aclarar o si necesita más ayuda. También recomiendo leer la lista de comandos y la documentación disponible en el redis web site, especialmente con respecto a la operación SORT.

+0

Gracias - en realidad terminé usando un HASH y un SET, en lugar de una LISTA - ¡pero buena respuesta! – Richard

1

Dado que user_id es único y también lo es el país, guárdelos en un par clave-valor simple. La solicitud para un usuario es O (1) en tal caso ... Luego, mantenga algunos Redis sets, con la clave page_id y miembros todos los user_ids ..

+0

Gracias. Mi preocupación sobre esto es: ¿y si inserta un nuevo usuario en el valor clave, entonces * antes * puede agregar la entrada establecida, la base de datos se cae? Cuando vuelva a aparecer, te quedarán pedazos de información medio enterrados. – Richard

+1

En tal caso, tiene dos opciones: mantener algún tipo de estado en su código de cliente, en otras palabras, examinar el resultado que redis regresa después de cada operación y comportarse como corresponde en casos de error, o usar http: // redis. io/commands # transactions; – hymloth

+1

Creo que [Pipelining] (http://redis.io/topics/pipelining) es una buena opción –

Cuestiones relacionadas