Удалить ключи с сервера 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 {}
Объяснение:
- Получает совпавшие ключи построчно
- sed добавляет кавычки в начале и конце каждой клавиши
- 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.
написать сценарий 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
используйте redis-cli, вызовите этот скрипт
redis-cli -h 127.0.0.1 -p 6379 --eval ./del.lua "*yourkeyspattern*"
Если вас беспокоит производительность, попробуйте заменить redis KEYS на команду SCAN в скрипте lua.