Spec-Zone.ru › Redis

SORT

SORT
Синтаксис
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern
  ...]] [ASC | DESC] [ALPHA] [STORE destination]
Доступно с версии:
1.0.0
Сложность по времени:
O(N+M*log(M)), где N — количество элементов в списке или множестве для сортировки, а M — количество возвращаемых элементов. Если элементы не отсортированы, сложность равна O(N).
Категории ACL:
@write, @set, @sortedset, @list, @slow, @dangerous,

Возвращает или сохраняет элементы, содержащиеся в списке, множестве или упорядоченном множестве по адресу key.

Также существует вариант этой команды для только чтения SORT_RO.

По умолчанию сортировка выполняется по численному значению, сравнивая элементы как числа с плавающей запятой двойной точности. Это выглядит следующим образом в простом виде:

SORT mylist

Предположим, mylist — это список чисел, эта команда вернёт тот же список, но элементы будут отсортированы по возрастанию. Для сортировки чисел по убыванию используйте модификатор DESC.

SORT mylist DESC

Если mylist содержит строковые значения и требуется лексикографическая сортировка, используйте модификатор ALPHA.

SORT mylist ALPHA

Redis учитывает UTF-8, если переменная окружения LC_COLLATE установлена корректно.

Количество возвращаемых элементов может быть ограничено с помощью модификатора LIMIT. Этот модификатор принимает аргумент offset, определяющий количество пропускаемых элементов, и аргумент count, определяющий количество возвращаемых элементов, начиная с offset. Следующий пример вернёт 10 элементов отсортированной версии mylist, начиная с элемента 0 (offset нумерация с нуля):

SORT mylist LIMIT 0 10

Практически все модификаторы могут быть использованы вместе. В следующем примере вернутся первые 5 элементов, отсортированных по убыванию в лексикографическом порядке:

SORT mylist LIMIT 0 5 ALPHA DESC

Сортировка по внешним ключам

Иногда нужно сортировать элементы, используя внешние ключи в качестве весов для сравнения, вместо сравнения самих элементов в списке, множестве или упорядоченном множестве. Предположим, список mylist содержит элементы 1, 2 и 3, представляющие уникальные идентификаторы объектов, хранящихся в object_1, object_2 и object_3. Когда у этих объектов есть связанные веса, хранящиеся в weight_1, weight_2 и weight_3, SORT можно настроить на использование этих весов для сортировки mylist следующим образом:

SORT mylist BY weight_*

Опция BY принимает шаблон (равный weight_* в данном примере), который используется для генерации ключей, используемых для сортировки. Эти имена ключей получаются путем подстановки первого вхождения * фактическим значением элемента в списке (1, 2 и 3 в этом примере).

Пропуск сортировки элементов

Опция BY также может принимать несуществующий ключ, что заставляет SORT пропустить операцию сортировки. Это полезно, если нужно получить внешние ключи (см. опцию GET ниже) без накладных расходов на сортировку.

SORT mylist BY nosort

Получение внешних ключей

Наш предыдущий пример возвращает только отсортированные идентификаторы. В некоторых случаях полезнее получить фактические объекты, а не их идентификаторы (object_1, object_2 и object_3). Получение внешних ключей, основанных на элементах в списке, множестве или упорядоченном множестве, можно сделать с помощью следующей команды:

SORT mylist BY weight_* GET object_*

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

Также возможно получить сам элемент, используя специальный шаблон #:

SORT mylist BY weight_* GET object_* GET #

Ограничения использования внешних ключей

При включении Redis cluster-mode нет гарантии существования внешних ключей на узле, на котором обрабатывается команда. В этом случае любое использование GET или BY, которые ссылаются на шаблон внешнего ключа, приведет к ошибке команды.

Начиная с Redis 7.0, любое использование GET или BY, которые ссылаются на шаблон внешнего ключа, будет разрешено только в том случае, если текущий пользователь, выполняющий команду, имеет полные права чтения ключей. Полные права чтения ключей могут быть установлены для пользователя, например, указанием '%R~*' или '~* с соответствующими правилами доступа к командам. Более подробную информацию об установке правил доступа к ACL см. в руководстве по команде ACL SETUSER. Если полные права чтения ключей не установлены, команда завершится ошибкой.

Сохранение результата операции SORT

По умолчанию SORT возвращает отсортированные элементы клиенту. С помощью опции STORE результат будет сохранен как список в указанном ключе вместо возвращения клиенту.

SORT mylist BY weight_* STORE resultkey

Интересный паттерн, используя SORT ... STORE заключается в назначении таймаута EXPIRE результатному ключу, чтобы в приложениях, где результат операции SORT может быть кэширован на некоторое время. Другие клиенты будут использовать кэшированный список вместо вызова SORT для каждого запроса. Когда ключ истечет, обновлённая версия кэша может быть создана путём повторного вызова SORT ... STORE.

Обратите внимание, что для правильной реализации этого паттерна важно избежать одновременного перестроения кэша несколькими клиентами. Здесь потребуется некий механизм блокировки (например, использование SETNX).

Использование хешей в опциях BY и GET

Возможным использованием опций BY и GET для полей хеша является следующая синтаксическая конструкция:

SORT mylist BY weight_*->fieldname GET object_*->fieldname

Строка -> используется для разделения имени ключа от имени поля хеша. Ключ подставляется как описано выше, и хранящийся в полученном ключе хеш используется для получения указанного поля хеша.

Возврат

Массив ответов: без использования опции store команда возвращает список отсортированных элементов. Целочисленный ответ: когда указана опция store, команда возвращает количество отсортированных элементов в целевом списке.

© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/sort/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API