Как объединить удаление сотен тысяч ключей со специальными символами в 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 удаляет миллионы запрошенных ключей.