Löschen Sie alle Einträge in einer Redis-Liste

80

Angenommen, Sie haben einen LIST-Datentyp in Redis. Wie löscht man alle Einträge? Ich habe das schon versucht:

LTRIM key 0 0
LTRIM key -1 0

Beide verlassen das erste Element. Dadurch bleiben alle Elemente übrig:

LTRIM key 0 -1

Ich sehe keinen separaten Befehl zum vollständigen Leeren einer Liste.

Paul A Jungwirth
quelle
2
@ DavidJames: Betrachten Sie es als eine andere Art, "foo" zu buchstabieren. Ich folge
Paul A Jungwirth
Ja, in Redis sind alle Datenstrukturen Schlüssel. Das bedeutet nicht, dass 'Schlüssel' in einem Beispiel nützlich ist. Im Gegenteil, denke ich. Die Verwendung mylistwürde Ihre Frage klarer machen. Zum Beispiel schreibt redis.io/commands/ltrim : LTRIM mylist 1 -1. Die Seite , die Sie zitieren ist ein Befehl Referenz und soll nicht als „Konvention“ zur Herstellung von guten Beispielen in Betracht gezogen werden.
David J.

Antworten:

149

Löschen Sie den Schlüssel, und alle Elemente werden gelöscht. Die Liste überhaupt nicht zu haben ist ähnlich wie keine Elemente darin zu haben. Redis löst keine Ausnahmen aus, wenn Sie versuchen, auf einen nicht vorhandenen Schlüssel zuzugreifen.

DEL key

Hier sind einige Konsolenprotokolle.

redis> KEYS *
(leere Liste oder Set)
redis> LPUSH nennt John
(Ganzzahl) 1
redis> LPUSH nennt Mary
(Ganzzahl) 2
redis> LPUSH nennt Alice
(Ganzzahl) 3
redis> LLEN-Namen
(Ganzzahl) 3
redis> LRANGE Namen 0 2
1) "Alice"
2) "Mary"
3) "John"
redis> DEL-Namen
(Ganzzahl) 1
redis> LLEN-Namen
(Ganzzahl) 0
redis> LRANGE Namen 0 2
(leere Liste oder Set)
Anurag
quelle
Gibt es eine Möglichkeit, dies in einer atomaren Operation zu tun? (beide "LRANGE Namen 0 2" und "DEL Namen")
Refaelos
1
Eine Sache, mit Del may create extra overhead, Zeitkomplexität: O (N) wobei N die Anzahl der Schlüssel ist, die entfernt werden. Wenn ein zu entfernender Schlüssel einen anderen Wert als eine Zeichenfolge enthält, ist die individuelle Komplexität für diesen Schlüssel O (M), wobei M die Anzahl der Elemente in der Liste, Menge, sortierten Menge oder dem Hash ist. Das Entfernen eines einzelnen Schlüssels, der einen Zeichenfolgenwert enthält, ist O (1). Die Dokumente
ChewOnThis_Trident
1
Diese Methode ist gefährlich, da sie auch das ttl des Schlüssels entfernt
Saitama
16

Sie können alle Werte in der Liste nur entfernen, wenn die Liste mehr als einen Wert enthält

LTRIM key -1 0

Beispiel:

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"

Aber wenn die Liste nur einen Wert hat, müssen Sie verwenden

DEL key 
ahmed hamdy
quelle
4

Verwenden Sie einfach LTRIM . ... Aaaund die Magie hier ist, start mehr als zu verwenden end .

LTRIM key 99 0

Und ... Boom! da geht die ganze Liste der Elemente. Nur * pooof * direkt vor deinen Augen !! Keine Rückstände mehr und absolut keine Fragen gestellt.

Hinweis: Dadurch wird der Schlüssel „entfernt“ werden ( wie in gelöscht ) , wie hier

... wenn start größer als das Ende der Liste ist oder start> end, ist das Ergebnis eine leere Liste (wodurch der Schlüssel entfernt wird).

Mohd Abdul Mujib
quelle
Gibt es einen Grund, warum Sie dies DEL keyder Antwort von @ Anurag vorziehen ? Es scheint, als hätten sie den gleichen Effekt.
Paul A Jungwirth
Ehrlich gesagt, nein, ich hatte nicht die Zeit, mir die Benchmarks anzuschauen. Ich habe gerade die Dokumente gelesen, als ich die obige Methode entdeckte. Ich dachte, ich könnte sie genauso gut erwähnen.
Mohd Abdul Mujib
1
Okay danke! Upvoted, weil ich mir Algorithmen vorstellen kann, die LTRIMwiederholt verwendet werden, und es ist gut zu wissen, was passiert, wenn der zweite Parameter unter den ersten fällt. Ich kann sehen, wie das Ausnutzen dieses Verhaltens Code eleganter machen kann.
Paul A Jungwirth
0

Die akzeptierte Antwort ist falsch. Angenommen, ich habe

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

um das Beispiel von ahmed zu verwenden, das eigentlich richtig ist. jetzt, wenn ich es tue:

DEL 'test4'

Am Ende habe ich:

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

Also habe ich nicht alle Einträge aus der 'test4'-Liste entfernt, sondern test4 selbst entfernt . nicht das gleiche. keineswegs. Ich habe eine kleine App, in der die Listenschlüssel Hashes sind, die aus mehreren Daten berechnet wurden (na ja, sind sie nicht alle?). Diese Listen werden manchmal gelöscht, aber die Semantik einer leeren Liste und einer nicht vorhandenen Liste ist sehr unterschiedlich. Also, nein, ich möchte nicht 'myhashes' löschen, ich möchte nur alle Einträge entfernen.

Vorsicht, oh ihr, wer hier wandert.

Deimosaffair
quelle
Wenn Sie sich die unten zitierte Seite ansehen, werden Sie feststellen, dass die Semantik tatsächlich dieselbe ist! Entnommen aus :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.
Dominic
aus dem Maul des Pferdes: "Ebenso wird der Schlüssel aus dem Schlüsselraum entfernt, wenn eine Listenoperation die Liste leer macht." Also, ist {[], [], []} === {[]}? nicht für mich. Ich denke, wir sind in verschiedenen topologischen Räumen .... :)
Deimosaffair
Nun, die erste Frage war, wie man eine ganze Liste in Redis löscht. Wenn Sie also entweder den Schlüssel löschen oder alle Einträge löschen und den Schlüssel automatisch von redis entfernen lassen, erhalten Sie das gleiche Ergebnis. Ich bin mir also nicht sicher, was du mit {[], [], []} === {[]} meinst.
Dominic
Das Entfernen des letzten Elements aus der Liste entspricht dem Löschen des Schlüssels. Dieser Link gilt auch für LIST (getestet mit RPOPLPUSH) bennadel.com/blog/…
Kanagavelu Sugumar
0

Ich habe es versucht und es funktioniert für mich. Ändern Sie einfach myList für Ihren Listennamen und führen Sie ihn aus redis-cli KEYS "myList:*" | xargs redis-cli DEL

Idiot
quelle
1
Obwohl dies funktioniert, keysist es eine extrem schwere Operation, bei der jeder einzelne Schlüssel in Ihrer Datenbank analysiert wird, was in diesem Fall oder in den meisten Fällen völlig unnötig ist
Adalcar
0

Dies könnte eine späte Antwort sein, aber ich bleibe hier, nur für den Fall, dass jemand diese Funktionalität noch benötigt.

Kurze Antwort

ltrim mylist 0 - (n + 1) wobei mylist der Schlüssel und n die Länge der mylist ist.

Lange Antwort

Die Funktionsweise von ltrim besteht darin, dass zwei Indizes verwendet werden und die dazwischen liegenden Elemente einschließlich der Indizes zurückgegeben werden.

Ltrim Liste startIndex endIndex

Beispiel unter der Annahme, dass wir eine Redis-Liste mit einer Schlüssel-Myliste haben, die 10 Einträge enthält:

ltrim mylist 0 5 schneidet die Liste auf Elemente ab Index 0 bis Index 5. Und verwirft diejenigen, die außerhalb dieses Bereichs liegen.

Glücklicherweise unterstützen Redis-List-Operationen eine negative Indizierung, die sich in einigen Situationen als äußerst nützlich erweist. Normalerweise, wenn Sie die Länge der Liste nicht kennen.

-1 bezieht sich auf das letzte Element, - 2 vorletztes Element usw. Und (-n) ist das erste Element.

Außerhalb des Bereichs liegende Indizes sind nicht schädlich. Wenn der Endindex größer als die Länge der Liste ist, wird er von redis als gleich dem letzten Index behandelt.

Deshalb lösche ltrim mylist 0, - (n +1) die Liste. Dies geschieht, weil (-n) dem Index 0 entspricht. Wenn Sie 1 hinzufügen, bleibt kein Element in diesem Bereich, da dies vor dem ersten Element liegt.

The-null-Pointer-
quelle
Vielen Dank für Ihre Erkenntnisse. Als Erweiterung Ihrer Antwort können Sie einfach einen Wert von N angeben, der ausreichend größer als die Liste ist, um sicherzustellen, dass alle Elemente gelöscht werden. Zum Beispiel ltrim mylist 0 -99999.
Dave Johnson