Как объединить удаление сотен тысяч ключей со специальными символами в Redis
У нас есть список из сотен тысяч ключей Redis, содержащих всевозможные специальные символы, и мы хотели бы удалить их. Есть несколько отличных ответов на аналогичную проблему по этому вопросу: Как атомизировать ключи, соответствующие шаблону, используя Redis
ОДНАКО, я не могу найти ответ на случай, когда:
- У нас есть большое количество ключей (сотни тысяч).
- Ключи имеют все манеры специальных символов, таких как двойные кавычки ("), обратная косая черта(), всевозможные странные символы Юникода и т.д.
- Мы используем клиент redis-cli для Windows
- Бонус: в идеале мы могли бы выполнить эту команду как часть транзакции MULTI/EXEC, чтобы мы могли также удаленно удалять SET вместе с клавишами.
Я бы ЛЮБЛЮ, если бы мы могли просто сделать что-то вроде ниже, но при этом обрабатывать ключи со всеми специальными символами, которые дают проблемы Redis:
redis-cli SMEMBERS "myGiganticListOfKeys" | xargs --delim='\n' redis-cli DEL
К сожалению, это просто дает ошибку ниже:
"C:/Program Files (x86)/Git/bin/xargs.exe": redis-cli: Bad file number
Я думаю, что это сработало бы, если бы у нас не было специальных символов в клавишах.
Спасибо за это заранее.
Ответы
Ответ 1
Вам следует попробовать создать приложение с использованием более надежного клиента.
См. список клиентов.
Redis-cli - очень простая утилита командной строки, предназначенная только для взлома/игры с Redis.
Я согласен с вами в том, что лучше всего будет переконструировать хранилище ключей/значений.
Рассмотрите возможность использования механизма тегирования, если вам нужно сделать недействительным несколько ключей: используйте хеш для группировки ключей по тегу при добавлении ключей, а затем аннулируйте весь тег, удалив все ключи в хеше.
Ответ 2
Вот как я его решил, это работает для zillions записей, не подчеркивая redis.
WARNING: PLEASE DO NOT TRY THIS AT HOME UNATTENDED AND MAKE SURE TO WEAR
ALL SAFETY EQUIPMENT NECESSARY FOR THE TASK.
Шаг 1. Сбросьте все нужные ключи из redis в файл, позвоните в этот файл YES_WE_CAN.sh
redis-cli KEYS "StartsWith*" > YES_WE_CAN.sh
Шаг 2: Откройте файл YES_WE_CAN.sh с vi или vim и нажмите символ :
, затем введите следующее, чтобы заменить специальный символ '
:
:%s/'/'"'"'/g
Это заменит все символы '
на escape-последовательность '"'"'
. (Поверьте мне, это работает, продолжайте!)
Шаг 3: Подготовить к каждой строке redis-cli DEL
(не забудьте пробел в конце):
:%s/^/redis-cli DEL /g
Шаг 4: Добавить в конце каждой строки символ '
:
:%s/$/'/g
Шаг 5: Сохраните файл и закройте с помощью :wq
Шаг 6: Измените файл YES_WE_CAN.sh
в исполняемом режиме:
chmod +x YES_WE_CAN.sh
Шаг 7: Запустите файл:
./YES_WE_CAN.sh
Наслаждайтесь кофе, а script удаляет миллионы запрошенных ключей.