Как удалить ключи, соответствующие шаблону в Redis Cluster

Я пробовал метод в этом вопросе, но он не работает, так как я работаю в режиме кластера, и Redis сказал мне:

(ошибка) CROSSSLOT Ключи в запросе не хэшируются в один и тот же слот

3 ответа

Решение

Ответы на этот вопрос пытаются удалить несколько ключей в одном DEL, Однако ключи, соответствующие данному шаблону, НЕ могут находиться в одном и том же слоте, и Redis Cluster НЕ поддерживает команду с несколькими ключами, если эти ключи не принадлежат одному и тому же слоту. Вот почему вы получаете сообщение об ошибке.

Чтобы решить эту проблему, вам нужно DEL эти ключи по очереди:

redis-cli --scan --pattern "foo*" |xargs -L 1 redis-cli del

-L вариант для xargs Команда указывает количество ключей для удаления. Вам нужно указать эту опцию как 1,

Чтобы удалить все ключи, соответствующие шаблону, вам также необходимо выполнить указанную выше команду для всех главных узлов в вашем кластере.

НОТА

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

  2. Или 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]"быть переданы команде, иначе пробелы заставят ее иметь два ключа.

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