Видаліть усі записи у списку Redis


82

Припустимо, у вас є тип даних LIST у Redis. Як видалити всі його записи? Я вже пробував це:

LTRIM key 0 0
LTRIM key -1 0

Обидва вони залишають перший елемент. Це залишить всі елементи:

LTRIM key 0 -1

Я не бачу окремої команди, щоб повністю очистити список.


2
@DavidJames: Розгляньте це як інший спосіб написання "foo". Я дотримуюсь конвенції, використаної у власній документації Редіса
Paul A Jungwirth

Так, у redis всі структури даних є ключами. Це не означає, що "ключ" корисний у прикладі. Я думаю, що все навпаки. Використання mylistзробить ваше питання зрозумілішим. Наприклад, redis.io/commands/ltrim пише: LTRIM mylist 1 -1. На сторінці ви цитуєте це команда посилання і не повинні розглядатися як «Конвенція» для створення прикладів хороших.
Девід Дж.

Відповіді:


151

Видаліть ключ, і це очистить всі елементи. Відсутність списку взагалі схоже на відсутність у ньому предметів. Redis не видасть жодних винятків при спробі отримати доступ до неіснуючого ключа.

DEL key

Ось кілька журналів консолі.

redis> КЛЮЧІ *
(порожній список або набір)
redis> LPUSH імена Джона
(ціле число) 1
redis> LPUSH імена Мері
(ціле число) 2
redis> LPUSH імена Аліса
(ціле число) 3
redis> LLEN імена
(ціле число) 3
redis> LRANGE імена 0 2
1) "Аліса"
2) "Мері"
3) "Джон"
redis> DEL імена
(ціле число) 1
redis> LLEN імена
(ціле число) 0
redis> LRANGE імена 0 2
(порожній список або набір)

Чи є спосіб зробити це за одну атомну операцію? (обидва "LRANGE імена 0 2" і "DEL імена")
refaelos

1
Одна річ, використовуючи Del may create extra overhead, складність часу: O (N), де N - кількість клавіш, які буде видалено. Коли ключ для видалення містить значення, відмінне від рядка, індивідуальна складність цього ключа - O (M), де M - кількість елементів у списку, наборі, відсортованому наборі чи хеші. Видалення одного ключа, що містить значення рядка, є O (1). В документи
ChewOnThis_Trident

2
цей метод небезпечний, оскільки він також видаляє ttl ключа
Сайтама

17

Ви можете видалити всі значення в списку тільки якщо список має більше одного значення

LTRIM key -1 0

Приклад:

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"

Але якщо список має лише одне значення, ви повинні використовувати

DEL key 

Як зазначалося в коментарях прийнятої відповіді: клавіша DEL ТАКОЖ вилучає ttl зі списку
patrick

4

Просто використовуйте LTRIM . ... Ааа, і магія тут полягає у використанні start більше ніж end .

LTRIM key 99 0

І ... бум! йде цілий перелік елементів. Просто * пуф * прямо перед очима !! Не залишилось залишків і абсолютно жодних питань.

Примітка: Це призведе до того, що ключ буде "видалено" ( як видалено ), як описано тут

... якщо початок більше кінця списку або start> end, результатом буде порожній список (що призводить до видалення ключа).


Чи є причина, чому ви віддаєте перевагу цьому, DEL keyяк у відповіді @ Anurag? Здається, вони мають однаковий ефект.
Paul A Jungwirth

Чесно кажучи, ні, не встиг вивчити еталони, просто читав документи, коли виявив вищезазначений метод, думав, що міг би про це згадати.
Мохд Абдул Муджиб

1
Добре, дякую! Прихильний, тому що я можу уявити алгоритми, які використовують LTRIMнеодноразово, і добре знати, що відбувається, коли другий параметр падає нижче першого. Я бачу, як використання цієї поведінки може зробити якийсь код більш елегантним.
Paul A Jungwirth,

0

прийнята відповідь неправильна. припустимо, що маю

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

використати приклад Ахмеда, що насправді є правильним. зараз, якщо я це роблю:

DEL 'test4'

я закінчую:

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

отже, я не видалив усі записи зі списку 'test4', я видалив сам test4 . не те саме. зовсім не. у мене є невеликий додаток, де ключі списку є хешами, обчисленими з кількох даних (ну, чи не всі?), ці списки іноді очищаються, але семантика порожнього списку та неіснуючого списку сильно відрізняється. так що ні, я не хочу видаляти «myhashes», я хочу просто видалити всі записи.

остерігайтеся, ой, хто тут блукає.


Якщо ви подивитесь на сторінку, процитовану нижче, то побачите, що насправді семантика РІВНА! Взято з :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.
Домінік

з пащі коней: "Подібним чином ключ видаляється з місця ключів, якщо операція списку спорожнить список". отже, {[], [], []} === {[]}? не для мене. я думаю, ми перебуваємо в різних топологічних просторах .... :)
deimosaffair

Ну, спочатку питання полягало в тому, як видалити весь список у redis. так що якщо ви або видалите ключ, або видалите всі записи, і ключ автоматично видалить Redis, ви отримаєте той самий результат. Тому я не впевнений, що ви маєте на увазі з [[], [], []} === {[]}.
Домінік

Видалення останнього елемента зі списку дорівнює видаленню ключа. Це посилання навіть те саме для LIST (протестовано на RPOPLPUSH) bennadel.com/blog/…
Kanagavelu Sugumar

0

Я спробував це, і це працює для мене. Просто змініть myList для імені вашого списку та запустіть його redis-cli KEYS "myList:*" | xargs redis-cli DEL


1
Хоча це працює, keysце надзвичайно важка операція, яка передбачає розбір кожного окремого ключа у вашій базі даних, що в цьому випадку, а точніше у більшості випадків, є зовсім непотрібним
Адалкар

0

Це може бути пізньою реакцією, але я наклеюю її тут на випадок, якщо комусь все-таки потрібна ця функціональність.

Коротка відповідь

ltrim mylist 0 - (n + 1), де mylist є ключовим, а n - довжиною mylist.

Довга відповідь

Спосіб роботи ltrim полягає в тому, що він приймає два індекси і повертає елементи, що потрапляють між ними, включаючи індекси.

Список Ltrim startIndex endIndex

Приклад, якщо припустити, що у нас є список повторного вибору з ключовим списком, що містить 10 записів:

ltrim mylist 0 5 обробить список елементами, починаючи від індексу 0 до індексу 5. І відкидає ті, які не входять до цього діапазону.

На щастя, операції зі списками redis підтримують негативне індексування, що виявляється надзвичайно корисним у деяких ситуаціях. Зазвичай, коли ви не знаєте довжини списку.

-1 відноситься до останнього елемента, - 2 передостаннього елемента і т. Д. І (-n) - перший елемент.

Індекси поза діапазоном не є шкідливими. Якщо кінцевий індекс перевищує довжину списку, redis розглядає його як рівний останньому індексу.

Ось чому ltrim mylist 0, - (n +1) очистити список. Це робиться тому, що (-n) еквівалентно індексу 0. Додавання 1 до нього не залишає жодного елемента в цьому діапазоні, оскільки це буде перед першим елементом.


Дякуємо, що поділилися своєю думкою. Як продовження вашої відповіді ви можете просто вказати значення N, яке є достатньо більшим за перелік, щоб гарантувати, що всі елементи будуть видалені. Наприклад ltrim mylist 0 -99999.
Dave Johnson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.