Как удалить ключи, соответствующие шаблону в Redis Cluster
Я пробовал метод в этом вопросе, но он не работает, так как я работаю в режиме кластера, и Redis сказал мне:
(ошибка) CROSSSLOT Ключи в запросе не хэшируются в один и тот же слот
3 ответа
Ответы на этот вопрос пытаются удалить несколько ключей в одном DEL
, Однако ключи, соответствующие данному шаблону, НЕ могут находиться в одном и том же слоте, и Redis Cluster НЕ поддерживает команду с несколькими ключами, если эти ключи не принадлежат одному и тому же слоту. Вот почему вы получаете сообщение об ошибке.
Чтобы решить эту проблему, вам нужно DEL
эти ключи по очереди:
redis-cli --scan --pattern "foo*" |xargs -L 1 redis-cli del
-L
вариант для xargs
Команда указывает количество ключей для удаления. Вам нужно указать эту опцию как 1
,
Чтобы удалить все ключи, соответствующие шаблону, вам также необходимо выполнить указанную выше команду для всех главных узлов в вашем кластере.
НОТА
С помощью этой команды вы должны удалить эти ключи по одному, и это может быть очень медленно. Вам нужно подумать о перепроектировании вашей базы данных и использовать хеш-теги, чтобы ключи, соответствующие шаблону, принадлежали одному и тому же слоту. Так что вы можете удалить эти ключи в одном
DEL
,Или
SCAN
или жеKEYS
команда неэффективна, особенно,KEYS
не должны использоваться в производстве. Вы должны рассмотреть возможность создания индекса для этих ключей.
Основываясь на ответе for_stack , вы можете немного ускорить массовое удаление, используя
redis-cli --pipe
и снизить влияние на производительность с помощью UNLINK
вместо
DEL
если вы используете Redis 4 или выше.
redis-cli --scan --pattern "foo*" | xargs -L 1 echo UNLINK | redis-cli --pipe
Вывод будет выглядеть примерно так:
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 107003
Вам все еще нужно запустить это на каждом главном узле в вашем кластере. Если у вас большое количество узлов, вероятно, можно автоматизировать процесс, проанализировав выходные данные CLUSTER NODES
.
redis-cli
обеспечивает
-c
возможность следовать
MOVED
перенаправляет. Однако их следует удалять по одному, потому что вы не можете гарантировать, что два ключа будут в одном узле.
redis-cli -h myredis.internal --scan --pattern 'mycachekey::*' | \
xargs -L 1 -d'\n' redis-cli -h myredis.internal -c del
Первая часть содержит список ключей
--scan
предотвращает блокировку Redis.
xargs -L 1
запускает команду для одной записи за раз.
-d'\n'
отключает обработку кавычек, поэтому вы можете заключать в кавычки такие строки, как
"SimpleKey[hello world]"
быть переданы команде, иначе пробелы заставят ее иметь два ключа.