Самый эффективный способ заменить большие ключи Redis

У меня есть большой отсортированный набор Redis. Нам нужно ежедневно переиндексировать данные в наборе, пока клиенты активно запрашивают данные из набора. Мой план состоит в том, чтобы просто создать второй набор, используя другой ключ, а затем заменить существующий ключ новым:

  1. Построить новый «индексированный» отсортированный набор
  2. ПЕРЕИМЕНОВАТЬ «индексированный» набор в «живой», чтобы заменить существующий «живой» набор.

Глядя на документацию RENAME, говорится:

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

Тогда мне интересно, не лучше ли переименовать «живой» отсортированный набор (например, в «мертвый»), а затем переименовать новый «индексированный» отсортированный набор в «живой» и передать эти запросы. И только потом отдельной командой DEL удалить «мертвый» набор:

  1. Построить новый «индексированный» отсортированный набор
  2. конвейер: ПЕРЕИМЕНОВАТЬ существующий «живой» набор на «мертвый»
  3. конвейер: ПЕРЕИМЕНОВАТЬ новый «индексированный», установленный на «живой»
  4. DEL "мертвый" набор

идеи?


person rhuff    schedule 30.03.2014    source источник


Ответы (1)


Используя DEL, вы только отсрочиваете проблему. Во время DEL Redis блокирует других клиентов.

Во-первых, я бы исследовал, насколько велика проблема. Это может быть проблемой, например, удаление 3,5 ГБ ключа ZSET занимает около 2 секунд в нашей промежуточной системе.

Если это проблема, разделите DEL с помощью ZREMRANGEBYRANK и ZCARD.

Конвейерная обработка эффективна (конечно, не транзакционная), поэтому она помогает заранее определить общий размер с помощью ZCARD, а затем выполнить N ZREMRANGEBYRANK команд (по конвейеру) с диапазоном (пример) -10000 0, заканчивающимся на «0-1». Как только все элементы будут удалены, Redis автоматически удалит сам ключ (отсортированный набор).

Надеюсь, это поможет, TW

person Tw Bert    schedule 30.03.2014
comment
Хорошая точка зрения. Истечение срока действия фонового ключа не блокирует, не так ли? Что, если мы установим для него 1 секунду EXPIRE? - person rhuff; 30.03.2014
comment
Я ожидаю, что срок действия истечет для блокировки. Не уверен на 100%, поправьте меня кто-нибудь, если я ошибаюсь. Expire живет на ключе, а не на членах. В AOF, а также в подчиненной синхронизации технически произойдет DEL. См. здесь. - person Tw Bert; 30.03.2014