Manager, Developer Education
Redis — хранилище ключей в памяти с открытым исходным кодом. В Redis отсортированные наборы данных — это тип данных, аналогичный наборам данных в том, что оба типа являются неповторяющимися группами строк. Разница в том, что каждый участник отсортированного набора связан с баллами, что позволяет им быть отсортироваными от наименьшего количества баллов к наибольшему. Как и в случае наборами данных, каждый участник отсортированного набора должен быть уникальным, хотя несколько участников могут иметь один и тот же балл.
В этом обучающем руководстве вы узнаете, как создавать отсортированные наборы данных, получать и удалять их участников, а также создавать новые отсортированные наборы из существующих.
Это руководство написано в виде шпаргалки с использованием отдельных примеров. Рекомендуем переходить сразу к любому разделу, относящемуся к вашей актуальной задаче.
Команды, указанные в этом руководстве, были протестированы на сервере Ubuntu 18.04 с версией Redis 4.0.9. Для настройки аналогичной среды вы можете воспользоваться шагом 1 нашего руководства Установка и обеспечение безопасности Redis в Ubuntu 18.04. Мы продемонстрируем, как эти команды ведут себя, выполнив их с помощью redis-cli
— интерфейса командной строки Redis. Обратите внимание, что если вы используете другой интерфейс Redis, например Redli, конкретный вывод некоторых команд может отличаться.
Также вы можете предоставить управляемый экземпляр базы данных Redis для тестирования этих команд, но при этом необходимо отметить, что в зависимости от уровня контроля, который используется вашим поставщиком базы данных, некоторые команды этого обучающего руководства могут не работать, как описано. Для предоставления управляемой базы данных DigitalOcean следуйте указаниям нашей документации по управляемым базам данных. Затем вы должны либо установить Redli, либо настроить туннель TLS в целях подключения к управляемой базе данных через TLS.
Для создания отсортированного набора используйте команду zadd
. zadd
принимает в качестве аргументов имя ключа, который будет хранить отсортированный набор, за которым следует балл участника, которого вы добавляете, и значение самого участника. Следующая команда создаст ключ отсортированного набора под названием faveGuitarists
с одним участником, Joe Pass
, который имеет балл 1
:
- zadd faveGuitarists 1 "Joe Pass"
zadd
вернет целое число, указывающее, сколько участников было добавлено в отсортированный набор, если он был успешно создан.
Output(integer) 1
Вы можете добавить несколько участников в отсортированный набор с помощью zadd
. Обратите внимание, что их баллы не должны быть последовательными — могут быть пробелы между баллами, и несколько участников, находящихся в одном и том же отсортированном наборе, могут иметь один и тот же балл:
- zadd faveGuitarists 4 "Stephen Malkmus" 2 "Rosetta Tharpe" 3 "Bola Sete" 3 "Doug Martsch" 8 "Elizabeth Cotten" 12 "Nancy Wilson" 4 "Memphis Minnie" 12 "Michael Houser"
Output(integer) 8
zadd
может принимать следующие опции, которые вы должны ввести после имени ключа и перед баллом первого участника:
NX
или XX
: эти опции имеют противоположные действия, поэтому вы можете включать только одну из них в любой операции zadd
:
NX
: указывает zadd
не обновлять существующих участников. С этой опцией zadd
будет добавлять только новые элементы.XX
: указывает zadd
обновлять только существующие элементы. С этой опцией zadd
никогда не будет добавлять новых участников.CH
. Как правило, zadd
возвращает только количество новых элементов, добавленных в отсортированный набор. Но если эта опция включена, zadd
будет возвращать количество измененных элементов. Сюда входят новые добавленные участники и участники, баллы которых были изменены.INCR
: заставляет команду увеличить значение балла участника. Если участник еще не существует, команда добавит его в отсортированный набор с увеличением в качестве его балла, как если бы его первоначальный балл был равен 0
. Если INCR
включен, zadd
будет возвращать новый балл участника, если операция успешна. Обратите внимание, что вы можете включать только одну пару «балл/участник» в момент использования этой опции.Вместо передачи опции INCR
в zadd
вы можете использовать команду zincrby
, которая ведет себя точно так же. Вместо того чтобы присваивать участнику отсортированного набора значение, указанное значением балла как zadd
, она увеличивает балл этого участника на это значение. Например, следующая команда увеличивает балл участника Stephen Malkmus
, который был первоначально равен 4
и увеличился на 5
до 9
.
- zincrby faveGuitarists 5 "Stephen Malkmus"
Output"9"
Как и в случае с опцией INCR
команды zadd
, если указанный участник не существует, то zincrby
создаст его со значением увеличения в качестве его балла.
Наиболее основополагающий способ получения участников, удерживаемых в отсортированном наборе — использовать команду zrange
. Эта команда принимает в качестве аргументов имя ключа, участников которого вы хотите получить, и ряд участников, находящихся в нем. Диапазон ряда определяется двумя числами, представляющими нулевые индексы — это означает, что 0
представляет первого участника отсортированного набора (или участника с наименьшим баллом), 1
представляет следующего и т. д.
Следующий пример вернет первые четыре участника из отсортированного набора faveGuitarists
, созданного в предыдущем разделе:
- zrange faveGuitarists 0 3
Output1) "Joe Pass"
2) "Rosetta Tharpe"
3) "Bola Sete"
4) "Doug Martsch"
Обратите внимание, что если отсортированный набор, который вы передаете в zrange
, имеет два или несколько элементов, которые имеют один и тот же балл, он будет обрабатывать эти элементы в лексикографическом или в алфавитном порядке.
Индексы start и stop могут также быть отрицательными числами, где -1
представляет последнего участника, -2
представляет предпоследнего участника и т. д.:
- zrange faveGuitarists -5 -2
Output1) "Memphis Minnie"
2) "Elizabeth Cotten"
3) "Stephen Malkmus"
4) "Michael Houser"
zrange
может принимать аргумент WITHSCORES
, который, при его включении, будет также возвращать баллы участников:
- zrange faveGuitarists 5 6 WITHSCORES
Output1) "Elizabeth Cotten"
2) "8"
3) "Stephen Malkmus"
4) "9"
zrange
может возвращать только ряд участников в восходящей числовой последовательности. Чтобы отменить это и вернуть диапазон в нисходящей последовательности, необходимо использовать команду zrevrange
. Эту команду можно представить как временно обращающую порядок данного отсортированного набора перед возвратом участников, находящихся в указанном диапазоне. Таким образом, с zrevrange
0
будет представлять последнего участника, содержащегося в ключе, 1
будет представлять предпоследнего и т. д.:
- zrevrange faveGuitarists 0 5
Output1) "Nancy Wilson"
2) "Michael Houser"
3) "Stephen Malkmus"
4) "Elizabeth Cotten"
5) "Memphis Minnie"
6) "Doug Martsch"
zrevrange
может также принимать опцию WITHSCORES
.
Вы можете возвращать ряд участников на основании их баллов с помощью команды zrangebyscore
. В следующем примере команда будет возвращать любого участника, удерживаемого в ключе faveGuitarists
с баллом 2, 3 или 4:
- zrangebyscore faveGuitarists 2 4
Output1) "Rosetta Tharpe"
2) "Bola Sete"
3) "Doug Martsch"
4) "Memphis Minnie"
В данном примере диапазон инклюзивный, т. е. он будет возвращать участников с баллами 2 или 4. Можете исключить любой конец диапазона, поставив перед ним открывающую скобку ((
). Следующий пример будет возвращать каждого участника с баллом выше или равным 2
, но ниже 4
:
- zrangebyscore faveGuitarists 2 (4
Output1) "Rosetta Tharpe"
2) "Bola Sete"
3) "Doug Martsch"
Как и в случае с zrange
, zrangebyscore
может принимать аргумент WITHSCORES
. Он также принимает опцию LIMIT
, которую вы можете использовать для получения только выбранных элементов из вывода zrangebyscore
. Эта опция принимает offset, который является первым участником в диапазоне, который будет возвращать команда, и count, который определяет, сколько участников команда будет возвращать в общей сложности. Например, следующая команда будет рассматривать первые шесть участников отсортированного набора faveGuitarists
, но будет возвращать только три участника из него, начиная со второго участника в диапазоне, представленного 1
:
- zrangebyscore faveGuitarists 0 5 LIMIT 1 3
Output1) "Rosetta Tharpe"
2) "Bola Sete"
3) "Doug Martsch"
Команда zrevrangebyscore
возвращает обращенный ряд участников на основе их баллов. Следующая команда возвращает каждого участника набора с балом между 10 и 6:
- zrevrangebyscore faveGuitarists 10 6
Output1) "Stephen Malkmus"
2) "Elizabeth Cotten"
Как и в случае с zrangebyscore
, zrevrangebyscore
может принимать обе опции WITHSCORES
и LIMIT
. Также вы можете исключать любой конец диапазона, ставя перед ним открытую скобку.
Возможно, будут случаи, когда у всех участников отсортированного набора будет один и тот же балл. В таком случае вы можете при помощи redis возвратить ряд элементов, отсортированных лексикографически или в алфавитном порядке, с помощью команды zrangebylex
. Чтобы попробовать эту команду, можно запустить следующую команду zadd
для создания отсортированного набора, где каждый участник имеет один и тот же балл:
- zadd SomervilleSquares 0 Davis 0 Inman 0 Union 0 porter 0 magoun 0 ball 0 assembly
Перед zrangebylex
должно идти имя ключа, интервал запуска и интервал остановки. Интервалы запуска и остановки должны начинаться с открытой скобки ((
) или открытой квадратной скобки ([
) — например, следующим образом:
- zrangebylex SomervilleSquares [a [z
Output1) "assembly"
2) "ball"
3) "magoun"
4) "porter"
Обратите внимание, что этот пример возвращает только четыре из восьми участников в наборе, даже если команда запросила диапазон от a
до z
. Это вызвано тем, что значения Redis чувствительны к регистру, поэтому участники, начинающиеся с заглавной буквы, были исключены из ее вывода. Для их возврата вы можете запустить следующее:
- zrangebylex SomervilleSquares [A [z
Output1) "Davis"
2) "Inman"
3) "Union"
4) "assembly"
5) "ball"
6) "magoun"
7) "porter"
zrangebylex
также принимает специальные символы -
, т. е. минус бесконечность, и +
, т. е. плюс бесконечность. Таким образом, следующий синтаксис команды будет также возвращать каждого участника отсортированного набора:
- zrangebylex SomervilleSquares - +
Обратите внимание, что zrangebylex
не может возвращать участников отсортированных наборов в обратном лексикографическом (восходящем алфавитном) порядке. Для этого нужно использовать zrevrangebylex
:
- zrevrangebylex SomervilleSquares + -
Output1) "porter"
2) "magoun"
3) "ball"
4) "assembly"
5) "Union"
6) "Inman"
7) "Davis"
Поскольку она предназначена для использования с отсортированными наборами данных, где каждый участник имеет один и тот же балл, zrangebylex
не принимает опцию WITHSCORES
. Однако она принимает опцию LIMIT
.
Для определения того, сколько участников находится в заданном отсортированном наборе (т. е. для определения его кардинальности), нужно использовать команду zcard
. Следующий пример показывает, сколько участников хранится в ключе faveGuitarists
из первого раздела этого руководства:
- zcard faveGuitarists
Output(integer) 9
zcount
может указать, сколько элементов хранится в определенном отсортированном наборе, который находится в диапазоне баллов. Первое число после ключа — начало диапазона, второе — конец диапазона:
- zcount faveGuitarists 3 8
Output(integer) 4
zscore
выводит балл указанного участника отсортированного набора:
- zscore faveGuitarists "Bola Sete"
Output"3"
Если либо указанный участник, либо ключ не существует, zscore
будет возвращать (nil)
.
zrank
аналогичен zscore
, но вместо того чтобы возвращать балл данного участника, он возвращает его ранг. В Redis ранг — нулевой индекс участников отсортированного набора в порядке их баллов. Например, Joe Pass
имеет балл 1
, но, поскольку это самый низкий балл любого участника в ключе, он имеет ранг 0
:
- zrank faveGuitarists "Joe Pass"
Output(integer) 0
Есть другая команда Redis под названием zrevrank
, выполняющая ту же функцию, что и zrank
, но вместо этого обращающая ранги участников в наборе. В следующем примере Joe Pass
имеет самый низкий балл и, соответственно, самый высокий обращенный ранг:
- zrevrank faveGuitarists "Joe Pass"
Output(integer) 8
Единственное отношение между баллом участника и его рангом — положение данного балла в сравнении с другими участниками. Если между двумя последовательными участниками существует разрыв баллов, это не будет отражено в их ранге. Обратите внимание, что если два участника имеют одинаковый балл, то тот, который является первым в алфавитном порядке, будет иметь более низкий ранг.
Как и zscore
, zrank
и zrevrank
будут возвращать (nil)
при отсутствии ключа или участника.
zlexcount
может указать, сколько участников хранится в отсортированном наборе между лексикографическим диапазоном. В следующем примере используется отсортированный набор SomervilleSquares
из предыдущего раздела:
- zlexcount SomervilleSquares [M [t
Output(integer) 5
Эта команда соответствует тому же синтаксису, что и команда zrangebylex
, поэтому подробные данные по определению строки см. в предыдущем разделе.
Команда zrem
может удалять один или несколько участников из отсортированного набора:
- zrem faveGuitarists "Doug Martsch" "Bola Sete"
zrem
будет возвращать целое число, указывающее, сколько участников она удалила из отсортированного набора:
Output(integer) 2
Есть три команды Redis, которые позволяют удалять участников отсортированного набора на основе диапазона. Например, если каждый участник отсортированного набора имеет одинаковый балл, вы можете удалять участников на основании лексикографического диапазона с помощью zremrangebylex
. Эта команда использует тот же синтаксис, что и zrangebylex
. Следующий пример удаляет каждого участника, который начинается с заглавной буквы, из ключа SomervilleSquares
, созданного в предыдущем разделе:
- zremrangebylex SomervilleSquares [A [Z
zremrangebylex
выведет целое число, указывающее, сколько участников было удалено:
Output(integer) 3
Вы можете также удалять участников на основе диапазона баллов с помощью команды zremrangebyscore
, которая использует тот же синтаксис, что и команда zrangebyscore
. В следующем примере будет удален каждый участник, находящийся в faveGuitarists
, с баллом 4, 5 или 6:
- zremrangebyscore faveGuitarists 4 6
Output(integer) 1
Вы можете удалять участников из набора на основе диапазона рангов с помощью команды zremrangebyrank
, которая использует тот же синтаксис, что и zrangebyrank
. Следующая команда удаляет три участника отсортированного набора с самыми низкими рангами, которые определяются диапазоном нулевых индексов:
- zremrangebyrank faveGuitarists 0 2
Output(integer) 3
Обратите внимание, что числа, передаваемые в remrangebyrank
, могут также быть отрицательными, при этом -1
представляет самый высокий ранг, -2
следующий самый высокий и т. д.
Redis содержит две команды, которые позволяют сопоставлять участников нескольких отсортированных наборов и создавать новые на основе этих сопоставлений: zinterstore
и zunionstore
. Для экспериментирования с этими командами нужно запустить следующие команды zadd
для создания некоторых отсортированных наборов в качестве примеров.
- zadd NewKids 1 "Jonathan" 2 "Jordan" 3 "Joey" 4 "Donnie" 5 "Danny"
- zadd Nsync 1 "Justin" 2 "Chris" 3 "Joey" 4 "Lance" 5 "JC"
zinterstore
находит участников, которые были представлены в двух или нескольких отсортированных наборах — т. е. данные пересекались — и создает новый отсортированный набор, содержащий только этих участников. Эта команда должна содержать по порядку имя ключа назначения, где будут храниться пересекающиеся участники в качестве отсортированного набора, количество ключей, передаваемых в zinterstore
, и имена ключей, которые вы хотите проанализировать:
- zinterstore BoyBands 2 NewKids Nsync
zinterstore
будет возвращать целое число, показывающее количество элементов, сохраненных в конечном отсортированном наборе. Поскольку NewKids
и Nsync
имеют только одного общего участника — Joey
, команда будет возвращать 1
:
Output(integer) 1
Учтите, что если конечный ключ уже существует, то zinterstore
перезапишет его содержимое.
zunionstore
создаст новый отсортированный набор, содержащий каждого участника ключей, переданных в него. Эта команда использует тот же синтаксис, что и zinterstore
, и требует имя конечного ключа, количество ключей, передаваемых в команду, и имена ключей:
- zunionstore SuperGroup 2 NewKids Nsync
Как и zinterstore
, zunionstore
будет возвращать целое число, показывающее количество элементов, указанных в конечном ключе. Хотя оба исходных отсортированных набора содержали пять участников, поскольку отсортированные наборы не могут содержать повторяющихся участников, а каждый ключ содержит одного участника под названием Joey
, итоговое целое число будет равняться 9
:
Output(integer) 9
Как и zinterstore
, zunionstore
перезаписывает содержимое конечного ключа, если он уже существует.
Чтобы предоставить вам возможность лучше контролировать баллы участников при создании новых отсортированных наборов при помощи zinterstore
и zunionstore
, обе эти команды принимают опции WEIGHTS
и AGGREGATE
.
После опции WEIGHTS
идет одно число для каждого отсортированного набора, включенного в команду, взвешивающего или перемножающего баллы каждого участника. Первое число после опции WEIGHTS
взвешивает баллы первого ключа, переданного команде; второе число взвешивает второй ключ и т. д.
В качестве следующего примера создается новый отсортированный набор, содержащий пересекающиеся ключи из отсортированных наборов NewKids
и Nsync
. Он взвешивает баллы в ключе NewKids
с коэффициентом 3 и взвешивает баллы в ключе Nsync
с коэффициентом 7:
- zinterstore BoyBandsWeighted 2 NewKids Nsync WEIGHTS 3 7
Если опция WEIGHTS
не включена, взвешивание производится по умолчанию с коэффициентом 1
— как для zinterstore
, так и для zunionstore
.
AGGREGATE
принимает три подопции. Первая из них, SUM
, осуществляет поведение zinterstore
и zunionstore
по умолчанию, добавляя баллы одинаковых участников в комбинированные наборы.
Если запускаете операцию zinterstore
или zunionstore
на двух отсортированных наборах, имеющих одного общего участника, но при этом этот участник имеет разные баллы для каждого набора, то можете заставить операцию назначать более низкий из двух баллов в новом наборе при помощи подопции MIN
.
- zinterstore BoyBandsWeightedMin 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MIN
Поскольку два отсортированных набора имеют только одного совпадающего участника с одинаковым баллом (3
), эта команда создаст новый набор с участником, равным более низкому значению их двух взвешенных баллов:
- zscore BoyBandsWeightedMin "Joey"
Output"9"
Аналогично AGGREGATE
может заставить zinterstore
или zunionstore
назначать более высокий из двух баллов с опцией MAX
:
- zinterstore BoyBandsWeightedMax 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MAX
Эта команда создает новый набор с одним участником Joey
, который имеет более высокий показатель взвешенного балла из двух:
- zscore BoyBandsWeightedMax "Joey"
Output"21"
Возможно, будет полезно рассматривать WEIGHTS
как способ временного манипулирования баллами участников перед анализом. Также полезно рассматривать опцию AGGREGATE
как способ решать, как контролировать баллы участников перед тем, как добавлять их к новым наборам.
В этом руководстве приводится информация о ряде команд, используемых для создания и управления отсортированными наборами данных в Redis. Если есть другие связанные команды, аргументы или процедуры, которые вы хотели бы видеть в этом руководстве, просьба обращаться с запросами или предложениями в комментариях ниже.
Дополнительную информацию о командах Redis можно найти в нашей серии обучающих руководств Управление базой данных Redis.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!