Редис ZSCAN

Redis Zscan



Итерация по членам отсортированного набора

Как вы все знаете, отсортированные наборы Redis являются производными от обычных наборов, где каждый элемент упорядочен по его значению оценки в порядке возрастания. Если два или более члена имеют одинаковое значение оценки, они упорядочиваются в лексикографическом порядке. Обычно элементы и оценки можно получить напрямую с помощью команды ZRANGE. Когда у вас есть большой отсортированный набор с тысячами элементов, команда ZRANGE может заблокировать сервер на долгое время, как команды SMEMBERS и KEYS, что является недостатком. Итак, Redis предлагает специальную команду под названием ZSCAN, которая является производной от команды SCAN для перебора элементов отсортированного набора. Поскольку команда ZSCAN наследуется от команды SCAN, почти все ее действия такие же, как у команды SCAN общего назначения.







Как и на данном рисунке, команда SCAN является итератором на основе курсора. Следовательно, для предоставления всех элементов коллекции Redis требуется одна или несколько итераций. Поскольку команда ZSCAN наследуется от родительской команды SCAN, поведение такое же. В этом руководстве будут подробно рассмотрены синтаксис и варианты использования команды ZSCAN.



Команда ZSCAN

Команда ZSCAN представляет собой итератор на основе курсора, который начинает итерацию с 0-го курсора. После этого на каждой итерации он возвращает ноль или более элементов отсортированного набора вместе со следующим курсором, который следует использовать в качестве курсора для следующего вызова команды. Если возвращаемый курсор равен 0 после одной или нескольких итераций, это означает, что процесс сканирования завершен. В этот момент возвращаются все члены отсортированного множества. Этот процесс называется полной итерацией. Как вы могли видеть, команда ZSCAN сохраняет свое состояние только с помощью курсора, что приводит к ограниченному пониманию состояния. Поэтому с командой ZSCAN связаны следующие недостатки.



  • Один и тот же элемент может возвращаться в нескольких итерациях.
  • Если элемент отсутствует в начале процесса сканирования, есть вероятность, что этот элемент не будет возвращен во время полной итерации.

Кроме того, нет никаких гарантий по количеству возвращенных членов. В некоторых случаях, если отсортированный набор очень мал, все элементы могут быть возвращены в самой первой итерации. Поскольку Redis использует специальный формат упакованного кодирования с одинарным размещением для хранения элементов до тех пор, пока не будет достигнуто максимальное количество элементов. Команда ZSCAN может вернуть курсор только в том случае, если отсканированная структура данных представлена ​​в виде хэш-таблицы.





Синтаксис:
Команда ZSCAN использует почти тот же синтаксис, что и команда SCAN, за исключением того, что она принимает отсортированный набор ключей в качестве первого аргумента. Синтаксис команды с разрешенными аргументами следующий:

Курсор ZSCAN sorted_set_key [ ПОИСКПОЗ шаблон ] [ Количество участников: COUNT ]

sorted_set_key : ключ отсортированного множества.
Курсор : значение курсора начинается с 0 и заканчивается на 0, если это полная итерация.



Следующие аргументы являются необязательными:

СООТВЕТСТВИЕ : шаблон для сопоставления при извлечении элементов в каждой итерации. Возвращаются только совпавшие члены.
СЧИТАТЬ : приблизительное количество элементов, которое должно быть возвращено в каждой итерации.

Возвращаемый набор результатов за итерацию содержит пару элементов. Первая часть представляет собой 64-битное целое число без знака, представляющее курсор, который будет передан в следующий вызов. Следующая часть представляет собой массив членов и связанных с ними оценок.

Вариант использования 1 — получить всех участников и выполненные ими миссии онлайн-игры

Предположим, что компания, занимающаяся онлайн-играми, ведет таблицу лидеров, используя отсортированный набор Redis. Поскольку в игру активно играют многие пользователи, им нужен способ получить каждого игрока и связанный с ним счет, который представляет собой количество выполненных миссий. Необходимо выполнить поиск, не блокируя сервер. Итак, рекомендуется использовать команду ZSCAN следующим образом:

Сначала мы создаем отсортированный набор с некоторыми игроками и количеством выполненных миссий.

zadd Таблица лидеров 12 Player6:Джон 4 Player2: Мэри 22 Player1: Патель пятнадцать Игрок: одиннадцать 23 Player5:Энн 30 Player7: Жесткий 23 Player12: Эбби два Player13:Ники 6 Player9: Джереми 7 Player45:Кина

Теперь мы можем перебирать элементы отсортированного набора следующим образом:

zscan Таблица лидеров 0

Выход:

Значение курсора равно 0 в возвращаемом наборе результатов, что означает, что все члены возвращаются в конце первой итерации. В этом случае, поскольку количество элементов невелико, Redis представляет эти элементы с помощью упакованного кодирования с одним размещением. Поэтому, пока не будет достигнут максимальный размер пакета или количество элементов, команда возвращает все элементы в отсортированном наборе. Это называется полной итерацией. Потому что в конце первой итерации мы получаем все десять участников и их баллы. Если у нас есть сотни членов, это представляется в виде хеш-таблицы в памяти. Таким образом, требуется несколько итераций, чтобы вернуть все элементы.

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

Вариант использования 2 — получить игроков, чье имя начинается с буквы «J»

Команду ZSCAN можно использовать для фильтрации возвращаемых элементов на основе совпадения с образцом. В этом случае необходимо указать аргумент ПОИСКПОЗ.

Давайте используем тот же пример из предыдущего варианта использования. Требование состоит в том, чтобы получить игроков, чье имя начинается с буквы «J». Это просто реализовать очередную интересную функцию, связанную с игрой. Аргумент ПОИСКПОЗ может быть указан следующим образом:

zscan Таблица лидеров 0 соответствие * Дж *

В идеале это должно вернуть двух участников, имена которых Джереми и Джон.

Вывод

Таким образом, команда ZSCAN используется для перебора членов и оценок отсортированного набора Redis. Эта команда ведет себя так же, как команда SCAN, за исключением того, что команда ZSCAN принимает ключ set в качестве первого аргумента. Как обсуждалось в примерах использования, команду ZSCAN можно использовать по-разному, указав аргументы MATCH и COUNT, где вы можете получить элементы и связанные с ними оценки, которые соответствуют определенному шаблону, и ограничить количество возвращаемых элементов за итерацию. В целом, команда ZSCAN может быть полезна при извлечении членов отсортированного набора без блокировки сервера или клиента.