Załóżmy, że masz typ danych LIST w Redis. Jak usunąć wszystkie jego wpisy? Próbowałem już tego:
LTRIM key 0 0
LTRIM key -1 0
Obie z nich opuszczają pierwszy element. To pozostawi wszystkie elementy:
LTRIM key 0 -1
Nie widzę osobnego polecenia do całkowitego opróżnienia listy.
mylist
uczyniłoby twoje pytanie jaśniejszym. Na przykład, redis.io/commands/ltrim piszeLTRIM mylist 1 -1
. Cytowana strona stanowi odniesienie do polecenia i nie należy jej traktować jako „konwencji” tworzenia dobrych przykładów.Odpowiedzi:
Usuń klucz, a to usunie wszystkie elementy. Brak listy jest podobny do braku pozycji na liście. Redis nie zgłosi żadnych wyjątków, gdy spróbujesz uzyskać dostęp do nieistniejącego klucza.
Oto kilka dzienników konsoli.
źródło
may create extra overhead
, złożoność czasu: O (N), gdzie N to liczba kluczy, które zostaną usunięte. Kiedy klucz do usunięcia zawiera wartość inną niż ciąg, indywidualna złożoność tego klucza wynosi O (M), gdzie M to liczba elementów na liście, zestawie, sortowanym zestawie lub skrócie. Usunięcie pojedynczego klucza, który przechowuje wartość ciągu, to O (1). W docsMożesz usunąć wszystkie wartości z listy tylko wtedy, gdy lista ma więcej niż jedną wartość
Przykład:
Ale jeśli lista ma tylko jedną wartość, musisz użyć
źródło
Po prostu użyj LTRIM . ... Aaa, a magia polega na tym, aby użyć
start
większego niżend
.I ... bum! tam jest cała lista elementów. Po prostu * kup * tuż przed twoimi oczami !! Żadnych pozostałości i absolutnie żadnych pytań.
Uwaga: Spowoduje to „usunięcie” klucza ( jak w przypadku usunięcia ), jak opisano tutaj
źródło
DEL key
w odpowiedzi @ Anurag? Wygląda na to, że mają ten sam efekt.LTRIM
wielokrotnie, i dobrze jest wiedzieć, co się stanie, gdy drugi parametr spadnie poniżej pierwszego. Widzę, jak wykorzystanie tego zachowania może uczynić kod bardziej eleganckim.przyjęta odpowiedź jest błędna. przypuszczam, że mam
posłużyć się przykładem Ahmeda, który jest faktycznie poprawny. teraz, jeśli to zrobię:
kończę z:
więc nie usunąłem wszystkich wpisów z listy „test4”, usunąłem sam test4 . nie to samo. Ani trochę. Mam małą aplikację, w której klucze list są skrótami obliczanymi z kilku danych (czyż nie wszystkie?), te listy czasami są czyszczone, ale semantyka pustej listy i nieistniejącej listy jest bardzo różna. więc nie, nie chcę DEL „myhashes”, chcę tylko usunąć wszystkie wpisy.
strzeżcie się, o wy, którzy tu wędrujecie.
źródło
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.
Próbowałem tego i to działa dla mnie. Po prostu zmień myList na nazwę swojej listy i wykonaj ją
redis-cli KEYS "myList:*" | xargs redis-cli DEL
źródło
keys
jest to niezwykle ciężka operacja, która polega na parsowaniu każdego klucza w twojej bazie danych, co jest dość niepotrzebne w tym przypadku, a raczej w większości przypadkówTo może być późna odpowiedź, ale trzymam ją tutaj na wypadek, gdyby ktoś nadal potrzebował tej funkcji.
Krótka odpowiedź
ltrim mylist 0 - (n + 1), gdzie mylist to klucz, a n to długość mylisty.
Długa odpowiedź
Sposób działania ltrim polega na tym, że pobiera dwa indeksy i zwraca elementy, które znajdują się między nimi, włącznie z indeksami.
Lista Ltrim startIndex endIndex
Przykład zakładając, że mamy listę redis z listą kluczy zawierającą 10 wpisów:
ltrim mylist 0 5 obetnie listę do elementów zaczynających się od indeksu 0 do indeksu 5. I odrzuci te, które wykraczają poza ten zakres.
Na szczęście operacje na listach redis obsługują indeksowanie ujemne, co jest niezwykle przydatne w niektórych sytuacjach. Zwykle, gdy nie znasz długości listy.
-1 oznacza ostatni element, - 2 przedostatni element itd. A (-n) jest pierwszym elementem.
Indeksy poza zakresem nie są szkodliwe. Jeśli indeks końcowy jest większy niż długość listy, redis traktuje go jako równy ostatniemu indeksowi.
Dlatego ltrim mylist 0, - (n +1) czyści listę. Dzieje się tak, ponieważ (-n) jest równoważne indeksowi 0. Dodanie 1 do niego nie pozostawia żadnego elementu w tym zakresie, ponieważ będzie to przed pierwszym elementem.
źródło
ltrim mylist 0 -99999
.