Eliminar todas las entradas en una lista de Redis

81

Suponga que tiene un tipo de datos LIST en Redis. ¿Cómo borras todas sus entradas? Ya intenté esto:

LTRIM key 0 0
LTRIM key -1 0

Ambos dejan el primer elemento. Esto dejará todos los elementos:

LTRIM key 0 -1

No veo un comando separado para vaciar completamente una lista.

Paul A Jungwirth
fuente
2
@DavidJames: Considérelo otra forma de deletrear "foo". Estoy siguiendo la convención utilizada en la propia documentación de Redis: redis.io/commands
Paul A Jungwirth
Sí, en redis, todas las estructuras de datos son claves. Eso no significa que la 'clave' sea útil en un ejemplo. Todo lo contrario, creo. Usar mylistharía su pregunta más clara. Por ejemplo, redis.io/commands/ltrim escribe: LTRIM mylist 1 -1. La página que cita es una referencia de comando y no debe considerarse una "convención" para hacer buenos ejemplos.
David J.

Respuestas:

150

Elimine la clave y eso borrará todos los elementos. No tener la lista en absoluto es similar a no tener ningún elemento en ella. Redis no arrojará ninguna excepción cuando intente acceder a una clave inexistente.

DEL key

Aquí hay algunos registros de la consola.

redis> LLAVES *
(lista vacía o conjunto)
redis> LPUSH nombra a John
(entero) 1
redis> LPUSH nombra a Mary
(entero) 2
redis> LPUSH nombra a Alice
(entero) 3
redis> Nombres LLEN
(entero) 3
redis> nombres LRANGE 0 2
1) "Alice"
2) "María"
3) "Juan"
redis> DEL nombres
(entero) 1
redis> Nombres LLEN
(entero) 0
redis> nombres LRANGE 0 2
(lista vacía o conjunto)
Anurag
fuente
¿Hay alguna forma de hacer eso en una operación atómica? (ambos "nombres LRANGE 0 2" y "nombres DEL")
refaelos
1
Una cosa, usando Del may create extra overhead, complejidad de tiempo: O (N) donde N es el número de claves que se eliminarán. Cuando una clave para eliminar tiene un valor que no es una cadena, la complejidad individual de esta clave es O (M) donde M es el número de elementos en la lista, conjunto, conjunto ordenado o hash. Eliminar una sola clave que contiene un valor de cadena es O (1). Los documentos
ChewOnThis_Trident
1
este método es peligroso ya que también elimina el ttl de la clave
Saitama
16

Puede eliminar todos los valores de la lista solo si la lista tiene más de un valor

LTRIM key -1 0

Ejemplo:

redis 127.0.0.1:6379> RPUSH mylist four 1 3 1
(integer) 4
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"
6) "mylist"
redis 127.0.0.1:6379> LTRIM mylist -1 0
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
(empty list or set)
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"

Pero si la Lista tiene un solo valor, debe usar

DEL key 
ahmed hamdy
fuente
4

Solo usa LTRIM . ... Aaa y la magia aquí es usar start mayor que end .

LTRIM key 99 0

¡Y bum! ahí va toda la lista de elementos. ¡¡Solo * pooof * justo en frente de tus ojos !! No quedan residuos y no se hacen preguntas.

Nota: Esto hará que la clave sea "eliminada" ( como en eliminada ) como se describe aquí.

... si el inicio es mayor que el final de la lista, o el inicio> el final, el resultado será una lista vacía (lo que hace que se elimine la clave).

Mohd Abdul Mujib
fuente
¿Hay alguna razón por la que prefieras esto DEL keycomo en la respuesta de @ Anurag? Parece que tienen el mismo efecto.
Paul A Jungwirth
Francamente no, no tuve el tiempo para mirar en los puntos de referencia, estaba leyendo los documentos cuando descubrí el método anterior, pensé que también podría mencionarlo.
Mohd Abdul Mujib
1
¡Bien gracias! Voto a favor porque puedo imaginar algoritmos que se usan LTRIMrepetidamente, y es bueno saber qué sucede cuando el segundo parámetro cae por debajo del primero. Puedo ver cómo explotar este comportamiento podría hacer que algún código sea más elegante.
Paul A Jungwirth
0

la respuesta aceptada es incorrecta. supongo que tengo

redis 127.0.0.1:6379> KEYS * 
1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "test4" 
5) "firstList" 
6) "mylist" 

para usar el ejemplo de ahmed, que en realidad es correcto. ahora, si lo hago:

DEL 'test4'

termino con:

1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "firstList" 
5) "mylist"` 

Por lo tanto, no se quitaron todas las entradas de la lista 'test4', i quitado test4 propio . no es lo mismo. De ningún modo. Tengo una pequeña aplicación donde las claves de la lista son hashes calculados a partir de varios datos (bueno, ¿no son todos?), esas listas a veces se borran, pero la semántica de una lista vacía y una lista inexistente son muy diferentes. entonces, no, no quiero BORRAR 'myhashes', solo quiero eliminar todas las entradas.

cuidado, oh tú que deambulas por aquí.

deimosaffair
fuente
Si observa la página que se cita a continuación, verá que, de hecho, ¡la semántica es la misma! Tomado de :The LPUSH command inserts a new element on the head, while RPUSH inserts a new element on the tail. A new list is created when one of this operations is performed against an empty key. Similarly the key is removed from the key space if a list operation will empty the list. These are very handy semantics since all the list commands will behave exactly like they were called with an empty list if called with a non-existing key as argument.
Domingo
de la boca del caballo: "De manera similar, la clave se elimina del espacio clave si una operación de lista vaciará la lista". entonces, ¿es {[], [], []} === {[]}? no para mí. supongo que estamos en diferentes espacios topológicos .... :)
deimosaffair
Bueno, la pregunta inicial era cómo eliminar una lista completa en redis. por lo tanto, si elimina la clave o elimina todas las entradas y redis la elimina automáticamente, obtendrá el mismo resultado. Así que no estoy seguro de a qué te refieres con {[], [], []} === {[]}.
Dominic
Eliminar el último elemento de la lista equivale a eliminar la clave. Este enlace también es el mismo para LIST (probado con RPOPLPUSH) bennadel.com/blog/…
Kanagavelu Sugumar
0

Probé esto y me funciona. Simplemente cambie myList por el nombre de su lista y ejecútelo redis-cli KEYS "myList:*" | xargs redis-cli DEL

idiota
fuente
1
Aunque esto funciona, keyses una operación extremadamente pesada que implica analizar cada clave en su base de datos, lo cual es bastante innecesario en este caso, o más bien en la mayoría de los casos
Adalcar
0

Esta podría ser una respuesta tardía, pero la voy a pegar aquí en caso de que alguien aún necesite esa funcionalidad.

Respuesta corta

ltrim mylist 0 - (n + 1) donde mylist es la clave y n es la longitud de mylist.

Respuesta larga

La forma en que ltrim funciona es que, toma dos índices y devuelve los elementos que se encuentran entre ellos, incluidos los índices.

Ltrim lista startIndex endIndex

Ejemplo asumiendo que tenemos una lista redis con mylist clave que contiene 10 entradas:

ltrim mylist 0 5 recortará la lista a elementos comenzando desde el índice 0 hasta el índice 5. Y descartará aquellos que estén fuera de ese rango.

Afortunadamente, las operaciones de redis list admiten la indexación negativa, lo que resulta extremadamente útil en algunas situaciones. Normalmente, cuando no conoce la longitud de la lista.

-1 se refiere al último elemento, - 2 al penúltimo elemento, etc. Y (-n) es el primer elemento.

Los índices fuera de rango no son dañinos. Si el índice final es mayor que la longitud de la lista, redis lo trata como igual al último índice.

Por eso ltrim mylist 0, - (n +1) borra la lista. Lo hace porque (-n) es equivalente al índice 0. Sumarle 1 no deja ningún elemento dentro de ese rango, ya que estará antes del primer elemento.

El-puntero-nulo-
fuente
Gracias por compartir tus ideas. Como extensión de su respuesta, simplemente podría proporcionar un valor de N que sea lo suficientemente mayor que la lista para garantizar que se eliminen todos los elementos. Por ejemplo ltrim mylist 0 -99999.
Dave Johnson