89 votes

Supprimer toutes les entrées dans une liste Redis

Supposons que vous ayez un datatype LIST dans Redis. Comment supprimer toutes ses entrées? J'ai déjà essayé ceci:

LTRIM key 0 0
LTRIM key -1 0

Les deux laissent le premier élément. Cela laissera tous les éléments:

LTRIM key 0 -1

Je ne vois pas de commande séparée pour vider complètement une liste.

2 votes

@DavidJames: Considérez-le comme une autre façon d'écrire "foo." Je suis en train de suivre la convention utilisée dans la propre documentation de Redis : redis.io/commandes

0 votes

Oui, dans redis, toutes les structures de données sont des clés. Cela ne signifie pas que 'key' est utile dans un exemple. Tout le contraire, je pense. Utiliser mylist rendrait votre question plus claire. Par exemple, redis.io/commands/ltrim écrit : LTRIM mylist 1 -1. La page que vous citez est une référence de commande et ne doit pas être considérée comme une "convention" pour créer de bons exemples.

165voto

Anurag Points 66470

Supprimez la clé, et cela effacera tous les éléments. Ne pas avoir la liste du tout est similaire à ne pas avoir d'éléments dedans. Redis ne lancera aucune exception lorsque vous essayez d'accéder à une clé inexistante.

DEL clé

Voici quelques journaux de la console.

redis> KEYS \*
(liste ou ensemble vide)
redis> LPUSH noms John
(entier) 1
redis> LPUSH noms Mary
(entier) 2
redis> LPUSH noms Alice
(entier) 3
redis> LLEN noms
(entier) 3
redis> LRANGE noms 0 2
1) "Alice"
2) "Mary"
3) "John"
redis> DEL noms
(entier) 1
redis> LLEN noms
(entier) 0
redis> LRANGE noms 0 2
(liste ou ensemble vide)

0 votes

Y a-t-il un moyen de le faire en une seule opération atomique? (à la fois "LRANGE noms 0 2" et "DEL noms")

1 votes

Une chose, l'utilisation de Del peut créer des frais supplémentaires, Complexité temporelle : O(N) où N est le nombre de clés qui seront supprimées. Lorsqu'une clé à supprimer contient une valeur autre qu'une chaîne, la complexité individuelle pour cette clé est O(M) où M est le nombre d'éléments dans la liste, le set, le sorted set ou le hash. Supprimer une seule clé contenant une valeur de chaîne est O(1). Les docs

3 votes

Cette méthode est dangereuse car elle supprime également le ttl de la clé

18voto

ahmed hamdy Points 1020

MISE À JOUR 06-11-2021

Il existe différentes façons de supprimer tous les éléments de la Liste :

Étape 1: Utilisation de la commande générale DEL pour supprimer n'importe quelle clé dans Redis comme la solution d'Anurag

DEL list

Étape 2: Utilisation de la commande LTRIM et application de la prochaine condition de la documentation

si le début est supérieur à la fin de la liste, ou si le début > fin, le résultat sera une liste vide (ce qui entraîne la suppression de la clé).

DONC l'une des commandes suivantes fonctionnera ou la solution de Mohd Abdul Mujib

LTRIM list 999 0

LTRIM list 1 0

LTRIM list 4 1

Mais faites attention à utiliser des nombres négatifs comme indice de début, comme indiqué dans la documentation

le début et la fin peuvent également être des nombres négatifs indiquant des décalages à partir de la fin de la liste, où -1 est le dernier élément de la liste, -2 l'avant-dernier élément, et ainsi de suite.

La commande suivante supprimera tous les éléments sous la liste SI la liste inclut plus d'un élément MAIS SI la liste inclut seulement un élément, rien ne sera supprimé

LTRIM list -1 0

Expliquer

Premier cas (liste incluant plus d'un élément) l'indice -1 en tant que début se traduira par le dernier élément qui a l'indice 4 (si la liste inclut 4 éléments) DONC la condition début > fin a été appliquée

Deuxième cas (liste incluant un élément) l'indice -1 en tant que début se traduira par le dernier élément qui a l'indice 0 donc la condition devient début == fin pas début > fin

Voici un exemple des commandes ci-dessus :

redis 127.0.0.1:6379> RPUSH mylist four 1 3 1
(integer) 4
redis 127.0.0.1:6379> KEYS *
1) "test4"
2) "firstList"
3) "mylist"
redis 127.0.0.1:6379> LTRIM mylist 999 0
OK
redis 127.0.0.1:6379> KEYS *
1) "test4"
2) "firstList"
redis 127.0.0.1:6379> RPUSH mylist four 1 3 1
(integer) 4
redis 127.0.0.1:6379> KEYS *
1) "test4"
2) "firstList"
3) "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) "test4"
2) "firstList"
redis 127.0.0.1:6379> RPUSH mylist four
(integer) 1
redis 127.0.0.1:6379> KEYS *
1) "test4"
2) "firstList"
3) "mylist"
redis 127.0.0.1:6379> LTRIM mylist -1 0
OK
redis 127.0.0.1:6379> KEYS *
1) "test4"
2) "firstList"
3) "mylist"

0 votes

Comme mentionné dans les commentaires de la réponse acceptée : la touche DEL supprimera ÉGALEMENT le ttl de la liste.

0 votes

Veuillez corriger l'allégation fausse dans votre réponse; il est possible de supprimer une liste avec une seule valeur également : stackoverflow.com/a/51497664/4960855

0 votes

@EliadL J'ai mis à jour ma réponse pour clarifier ma solution suggérée qui est toujours correcte (après test), en proposant une autre solution qui est également correcte, et sa solution fonctionnera dans tous les cas [liste avec un élément ou plus d'un élément]

6voto

wardha-Web Points 473

Il suffit d'utiliser LTRIM. ...Et la magie ici est d'utiliser début supérieur à fin.

LTRIM clé 99 0

Et...boom! là s'en vont tous les éléments de la liste. Juste * pouf * devant vos yeux !! Aucun résidu restant, et absolument aucune question posée.

Remarque: Cela entraînera la "suppression"(comme dans la suppression) de la clé comme décrit ici

... si le début est plus grand que la fin de la liste, ou début > fin, le résultat sera une liste vide (ce qui provoque la suppression de la clé).

0 votes

Est-ce qu'il y a une raison pour laquelle vous préférez ceci à la touche DEL comme dans la réponse de @Anurag ? Il semble qu'ils ont le même effet.

0 votes

Franchement non, je n'ai pas eu le temps de regarder les benchmarks, je lisais simplement la documentation quand j'ai découvert la méthode ci-dessus, j'ai pensé que je pourrais aussi bien le mentionner.

1 votes

D'accord, merci! Upvoté car je peux imaginer des algorithmes qui utilisent LTRIM à plusieurs reprises, et il est bon de savoir ce qui se passe lorsque le deuxième paramètre tombe en dessous du premier. Je peux voir comment exploiter ce comportement pourrait rendre certains codes plus élégants.

0voto

The-null-Pointer- Points 353

Ceci pourrait être une réponse tardive mais je la mets ici au cas où quelqu'un aurait encore besoin de cette fonctionnalité.

Réponse courte

ltrim mylist 0 - (n+1) où mylist est la clé et n est la longueur de mylist.

Réponse longue

La façon dont fonctionne ltrim est qu'elle prend deux indices et renvoie les éléments qui se trouvent entre eux inclusivement des indices.

Ltrim list startIndex endIndex

Exemple en supposant que nous avons une liste redis avec la clé mylist contenant 10 entrées:

ltrim mylist 0 5 va recadrer la liste pour commencer à l'index 0 jusqu'à l'index 5. Et rejeter ceux qui sont en dehors de cette plage.

Heureusement, les opérations de liste redis prennent en charge l'indexation négative, ce qui s'avère extrêmement utile dans certaines situations. Typiquement lorsque vous ne connaissez pas la longueur de la liste.

-1 fait référence au dernier élément, -2 à l'avant-dernier élément, etc. Et (-n) est le premier élément.

Les index hors de portée ne sont pas nocifs. Si l'index de fin est supérieur à la longueur de la liste, redis le traite comme égal au dernier index.

C'est pourquoi ltrim mylist 0, -(n +1) vide la liste. Cela se fait car (-n) est équivalent à l'index 0. En y ajoutant 1, cela ne laisse aucun élément dans cette plage car cela sera avant le premier élément.

0 votes

Merci d'avoir partagé vos idées. En complément de votre réponse, vous pourriez simplement fournir une valeur de N qui est suffisamment grande que celle de la liste pour garantir que tous les éléments soient supprimés. Par exemple ltrim mylist 0 -99999.

0voto

idioto Points 136

J'ai essayé cela et cela fonctionne pour moi. Il suffit de remplacer myList par le nom de votre liste et de l'exécuter redis-cli KEYS "myList:*" | xargs redis-cli DEL

1 votes

Bien que cela fonctionne, keys est une opération extrêmement lourde qui implique l'analyse de chaque clé de votre base de données, ce qui est assez inutile dans ce cas, ou plutôt dans la plupart des cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X