2012-02-16 20 views
34

Me pregunto si hay una forma de comprobar si una clave ya existe en una lista redis.Comprobando si existe un valor en una lista Redis

No puedo usar un conjunto porque no quiero forzar la exclusividad, pero sí quiero poder verificar si la cadena está realmente allí.

Gracias.

Respuesta

54

Sus opciones son las siguientes:

  1. Usando LREM y su sustitución si se ha encontrado.
  2. Mantener una separada SET en conjunto con su LIST
  3. bucle a través de la LIST hasta encontrar el artículo o llegar al final.

Las listas de Redis se implementan como http://en.wikipedia.org/wiki/Linked_list, de ahí las limitaciones.

Creo que su mejor opción es mantener un duplicado SET. Esto es lo que tiendo a hacer. Solo piense en ello como un índice adicional. De todos modos, asegúrese de que sus acciones sean atómicas con MULTI - EXEC o scripts Lua.

+1

+1 para MULTI-EXEC – maximus

+0

@fritzy ¿sería posible elaborar más acerca de cómo implementar el SET/LIST o señalarme en alguna parte, gracias? –

+0

Dado que tanto el LREM como el SREM son O (N), entonces es mejor no tener un conjunto separado (a menos que, por supuesto, planee eliminar todo el conjunto en lugar de elemento por elemento). –

4

No, no hay forma de comprobar si una lista redis contiene un valor determinado. Ver Redis list commands para referencia.

Supongo que podría usar LREM para (intentar) eliminar el valor y verificar el valor de retorno para ver si se eliminó. Pero entonces tendrías que volver a ponerlo, y parece dudoso. Probablemente haya alguna solución mejor para su problema: ¿qué está tratando de lograr?

+1

Hola linus, supongo que él está preguntando si existe una "clave" o no. no tiene un valor dado, como usted supone – zotherstupidguy

+0

@babydudecoder Dijo que quiere verificar que una clave ya existe en una lista redis. Creo que su clave es un valor de la lista redis. –

+0

@Harry Parece que en la mayoría de los casos podría sustituir la lista por un 'hset' y usar' setnx', eso no es lo mismo que tener una lista real, por supuesto, pero las tablas hash generalmente son búsquedas más rápidas. – user3467349

21

listas permiten duplicados, pero no proporcionan una manera sencilla de comprobar la existencia y como se aconseja @Fritzy, o hay que hacer:

  • Realiza múltiples operaciones (quitar a continuación, añadir de nuevo se encuentra) para los controles simples = los costes a tiempo
  • tener dos grupos separados = costos en la historia

me sorprende que nadie se aconseja utilizar una Hash Tabla o un conjunto Ordenada que combinan ventajas de permitiendo duplicidad (almacenando el número de elementos como valor - Hash Tabla, o la puntuación - Ordenada Set) y órganos de ajuste por naturaleza de una tabla/juego de hash


tabla hash

para comprobar si hay una existencia clave, utilice el comando HGET. Devuelve una respuesta nil si el miembro especificado no existe.

Para agregar un nuevo miembro, simplemente use HINCRBY, que actualizará el valor (es decir, la cantidad de elementos con el nombre del miembro) o creará un nuevo miembro si no existe.


Ordenado Conjunto

Para comprobar la existencia de una clave, utilice uno de los tres siguientes comandos:

  • ZSCORE
  • ZRANK
  • ZREVRANK

Devuelven una respuesta nil si el miembro especificado no existe.

Para agregar un nuevo miembro, simplemente use ZINCRBY que actualizará el puntaje (es decir, la cantidad de elementos con el nombre del miembro) o creará un nuevo miembro si no existe.


Para resumir: Ordenado Establece o Hash Tables le permiten realizar todas las operaciones con sus requisitos con un solo comando.

+0

Sin embargo, si alguien utiliza un conjunto ordenado, no hay forma de saber exactamente dónde están estas múltiples instancias de un valor presente en la lista. Si tengo el valor "Hello World" en ubicaciones arbitrarias en una lista, el solo hecho de almacenar el número de veces que aparece no me ayudaría a localizar los elementos circundantes de esas instancias. –

+0

@AnuraagVaidya Este es otro problema, no relevante en el contexto actual de respuesta a la pregunta formulada. –

Cuestiones relacionadas