Usuń wszystkie wpisy z listy Redis

82

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.

Paul A Jungwirth
źródło
2
@DavidJames: Potraktuj to jako inny sposób pisowni „foo”. Postępuję
Paul A Jungwirth
Tak, w redis wszystkie struktury danych są kluczami. Nie oznacza to, że „klucz” jest przydatny w przykładzie. Myślę, że wręcz przeciwnie. Użycie mylistuczyniłoby twoje pytanie jaśniejszym. Na przykład, redis.io/commands/ltrim pisze LTRIM mylist 1 -1. Cytowana strona stanowi odniesienie do polecenia i nie należy jej traktować jako „konwencji” tworzenia dobrych przykładów.
David J.

Odpowiedzi:

151

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.

DEL key

Oto kilka dzienników konsoli.

redis> KLUCZE *
(pusta lista lub zestaw)
redis> LPUSH nazywa Johna
(liczba całkowita) 1
redis> LPUSH nazywa Mary
(liczba całkowita) 2
redis> LPUSH nazywa Alice
(liczba całkowita) 3
redis> LLEN names
(liczba całkowita) 3
redis> LRANGE nazwy 0 2
1) „Alicja”
2) „Maria”
3) „Jan”
redis> DEL nazwy
(liczba całkowita) 1
redis> LLEN names
(liczba całkowita) 0
redis> LRANGE nazwy 0 2
(pusta lista lub zestaw)
Anurag
źródło
Czy można to zrobić w jednej operacji atomowej? (zarówno „LRANGE names 0 2”, jak i „DEL names”)
refaelos
1
Jedna rzecz, używając Del 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 docs
ChewOnThis_Trident
2
ta metoda jest niebezpieczna, ponieważ usuwa również ttl klucza
Saitama
17

Możesz usunąć wszystkie wartości z listy tylko wtedy, gdy lista ma więcej niż jedną wartość

LTRIM key -1 0

Przykład:

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"

Ale jeśli lista ma tylko jedną wartość, musisz użyć

DEL key 
ahmed hamdy
źródło
Jak wspomniano w komentarzach do zaakceptowanej odpowiedzi: klawisz DEL usunie RÓWNIEŻ ttl z listy
patrick
4

Po prostu użyj LTRIM . ... Aaa, a magia polega na tym, aby użyć start większego niż end .

LTRIM key 99 0

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

... jeśli początek jest większy niż koniec listy lub początek> koniec, wynikiem będzie pusta lista (co powoduje usunięcie klucza).

Mohd Abdul Mujib
źródło
Czy jest jakiś powód, dla którego wolisz to bardziej niż DEL keyw odpowiedzi @ Anurag? Wygląda na to, że mają ten sam efekt.
Paul A Jungwirth
Szczerze mówiąc nie, nie miałem czasu na przyjrzenie się testom porównawczym, właśnie czytałem dokumenty, kiedy odkryłem powyższą metodę, pomyślałem, że równie dobrze mógłbym o tym wspomnieć.
Mohd Abdul Mujib
1
Ok, dzięki! Zaopiniowano, ponieważ mogę sobie wyobrazić algorytmy, które używają LTRIMwielokrotnie, 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.
Paul A Jungwirth
0

przyjęta odpowiedź jest błędna. przypuszczam, że mam

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

posłużyć się przykładem Ahmeda, który jest faktycznie poprawny. teraz, jeśli to zrobię:

DEL 'test4'

kończę z:

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

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.

deimosaffair
źródło
Jeśli spojrzysz na cytowaną poniżej stronę, zobaczysz, że w rzeczywistości semantyka jest taka sama! Zaczerpnięte z :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
z paszczy konia: "Podobnie klucz jest usuwany z przestrzeni klucza, jeśli operacja na liście opróżni listę." więc czy {[], [], []} === {[]}? nie dla mnie. myślę, że jesteśmy w różnych przestrzeniach topologicznych .... :)
deimosaffair
Cóż, pierwsze pytanie brzmiało: jak usunąć całą listę w redis. więc jeśli usuniesz klucz lub usuniesz wszystkie wpisy i automatycznie usuniesz klucz przez redis, otrzymasz ten sam wynik. Nie jestem więc pewien, co masz na myśli, mówiąc o {[], [], []} === {[]}.
Dominic
Usunięcie ostatniego elementu z listy jest równoznaczne z usunięciem klucza. Ten link jest nawet taki sam dla LISTY (testowany z RPOPLPUSH) bennadel.com/blog/…
Kanagavelu Sugumar
0

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

idioto
źródło
1
Chociaż to działa, keysjest 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ów
Adalcar
0

To 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.

Wskaźnik zerowy-
źródło
Dziękuję za podzielenie się spostrzeżeniami. Jako rozszerzenie swojej odpowiedzi możesz po prostu podać wartość N, która jest wystarczająco większa niż lista, aby zagwarantować, że wszystkie pozycje zostaną usunięte. Na przykład ltrim mylist 0 -99999.
Dave Johnson,