Удалить ключи с сервера Redis с помощью Redis-Cli

Я пытаюсь удалить ключи с помощью шаблона с сервера Redis, но он не удаляется.

Образцы ключей

1) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x03\t\xa0\x01"
2) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x03\t\x98\x02"
3) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x03\t\xb8\x02"
4) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x02\t!"
5) "flc_1310sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x02\t~"
6) "flc_1310sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x03\t\xc0\x02"
7) "flc_-41sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x03\t\xc5\x01"
8) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x03\t\x94\x03"
9) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x03\t\xd3\x01"
10) "flc_77sandeep-pant-back.int.dev.mykronos.com_personality:\xac\xed\x00\x05w\x0e\x03\x01SecondaryKe\xf9:\xac\xed\x00\x05w\x03\t\xee\x02"

команда

redis-cli КЛЮЧИ * Сандип-пант * | xargs redis-cli DEL

Выход

xargs: WARNING: a NUL character occurred in the input.  It cannot be passed through in the argument list.  Did you mean to use the --null option?
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
(integer) 0

5 ответов

Если вы не хотите писать bash-скрипт, используйте этот однострочный

redis-cli --scan --pattern "*sandeep-pant*" | sed -e 's/^/"/g' -e 's/$/"/g' | xargs -i redis-cli del {}

Объяснение:

  1. Получает совпавшие ключи построчно
  2. sed добавляет кавычки в начале и конце каждой клавиши
  3. xargs удаляет записи по одной.

{} - это маркер, где ключ должен быть помещен в скрипт

Вы не должны использовать KEYS так как это операция блокировки, используйте SCAN вместо. Если вы используете шаблон glob, заключите его в кавычки:

redis-cli --scan --pattern '*sandeep-pant*' | xargs -L 100 redis-cli del

Вы можете использовать -L 100 выпекать DEL опс со 100 ключами каждый раз.

Код Bash:

for k in $(redis-cli -a password1 keys "*"); do
  echo "delete key '$k'";
  redis-cli -a password1 DEL $k;
done

Удалить -a password1 если не нужен пароль

Возможно, вы захотите прочитать документацию оDEL - когда вы это сделаете, вы заметите, что он не принимает шаблоны имен ключей (то есть подстановочные знаки), но требует точных имен ключей для удаления.

Если ваш ключ Redis вставлен приложением Redis с весенней загрузкой и используется JdkSerializationRedisSerializer, ключи будут начинаться с такого:\xac\xed\x00\x05w\x03, xargs не может нормально прочитать этот ключ, в этом случае вы можете использовать сценарий Lua.

  1. написать сценарий Lua, сохраненный, например, как del.lua

            local key=KEYS[1]
    local list=redis.call("keys", key);
    for i,v in ipairs(list) do
        redis.call("del", v);
    end
    
  2. используйте redis-cli, вызовите этот скрипт

            redis-cli -h 127.0.0.1 -p 6379 --eval ./del.lua "*yourkeyspattern*" 
    

Если вас беспокоит производительность, попробуйте заменить redis KEYS на команду SCAN в скрипте lua.

Другие вопросы по тегам