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.
mylist
wü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.Antworten:
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.
Hier sind einige Konsolenprotokolle.
quelle
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 DokumenteSie können alle Werte in der Liste nur entfernen, wenn die Liste mehr als einen Wert enthält
Beispiel:
Aber wenn die Liste nur einen Wert hat, müssen Sie verwenden
quelle
Verwenden Sie einfach LTRIM . ... Aaaund die Magie hier ist,
start
mehr als zu verwendenend
.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
quelle
DEL key
der Antwort von @ Anurag vorziehen ? Es scheint, als hätten sie den gleichen Effekt.LTRIM
wiederholt 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.Die akzeptierte Antwort ist falsch. Angenommen, ich habe
um das Beispiel von ahmed zu verwenden, das eigentlich richtig ist. jetzt, wenn ich es tue:
Am Ende habe ich:
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.
quelle
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.
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
quelle
keys
ist 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 istDies 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.
quelle
ltrim mylist 0 -99999
.