One place for hosting & domains

      отсортированными

      Управление отсортированными наборами данных в Redis


      Введение

      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

      Output

      1) "Joe Pass" 2) "Rosetta Tharpe" 3) "Bola Sete" 4) "Doug Martsch"

      Обратите внимание, что если отсортированный набор, который вы передаете в zrange​​​, имеет два или несколько элементов, которые имеют один и тот же балл, он будет обрабатывать эти элементы в лексикографическом или в алфавитном порядке.

      Индексы start и stop могут также быть отрицательными числами, где -1 представляет последнего участника, -2 представляет предпоследнего участника и т. д.:

      • zrange faveGuitarists -5 -2

      Output

      1) "Memphis Minnie" 2) "Elizabeth Cotten" 3) "Stephen Malkmus" 4) "Michael Houser"

      zrange может принимать аргумент WITHSCORES, который, при его включении, будет также возвращать баллы участников:

      • zrange faveGuitarists 5 6 WITHSCORES

      Output

      1) "Elizabeth Cotten" 2) "8" 3) "Stephen Malkmus" 4) "9"

      zrange может возвращать только ряд участников в восходящей числовой последовательности. Чтобы отменить это и вернуть диапазон в нисходящей последовательности, необходимо использовать команду zrevrange. Эту команду можно представить как временно обращающую порядок данного отсортированного набора перед возвратом участников, находящихся в указанном диапазоне. Таким образом, с zrevrange 0 будет представлять последнего участника, содержащегося в ключе, 1 будет представлять предпоследнего и т. д.:

      • zrevrange faveGuitarists 0 5

      Output

      1) "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

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch" 4) "Memphis Minnie"

      В данном примере диапазон инклюзивный, т. е. он будет возвращать участников с баллами 2 или 4. Можете исключить любой конец диапазона, поставив перед ним открывающую скобку (​​​(​​​). Следующий пример будет возвращать каждого участника с баллом выше или равным 2, но ниже 4:

      • zrangebyscore faveGuitarists 2 (4

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch"

      Как и в случае с zrange, zrangebyscore может принимать аргумент WITHSCORES. Он также принимает опцию LIMIT, которую вы можете использовать для получения только выбранных элементов из вывода zrangebyscore. Эта опция принимает offset, который является первым участником в диапазоне, который будет возвращать команда, и count, который определяет, сколько участников команда будет возвращать в общей сложности. Например, следующая команда будет рассматривать первые шесть участников отсортированного набора faveGuitarists, но будет возвращать только три участника из него, начиная со второго участника в диапазоне, представленного 1:

      • zrangebyscore faveGuitarists 0 5 LIMIT 1 3

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch"

      Команда zrevrangebyscore возвращает обращенный ряд участников на основе их баллов. Следующая команда возвращает каждого участника набора с балом между 10 и 6:

      • zrevrangebyscore faveGuitarists 10 6

      Output

      1) "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

      Output

      1) "assembly" 2) "ball" 3) "magoun" 4) "porter"

      Обратите внимание, что этот пример возвращает только четыре из восьми участников в наборе, даже если команда запросила диапазон от a до z. Это вызвано тем, что значения Redis чувствительны к регистру, поэтому участники, начинающиеся с заглавной буквы, были исключены из ее вывода. Для их возврата вы можете запустить следующее:

      • zrangebylex SomervilleSquares [A [z

      Output

      1) "Davis" 2) "Inman" 3) "Union" 4) "assembly" 5) "ball" 6) "magoun" 7) "porter"

      zrangebylex также принимает специальные символы -, т. е. минус бесконечность, и +, т. е. плюс бесконечность. Таким образом, следующий синтаксис команды будет также возвращать каждого участника отсортированного набора:

      • zrangebylex SomervilleSquares - +

      Обратите внимание, что zrangebylex не может возвращать участников отсортированных наборов в обратном лексикографическом (восходящем алфавитном) порядке. Для этого нужно использовать zrevrangebylex:

      • zrevrangebylex SomervilleSquares + -

      Output

      1) "porter" 2) "magoun" 3) "ball" 4) "assembly" 5) "Union" 6) "Inman" 7) "Davis"

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

      Получение информации по отсортированным наборам

      Для определения того, сколько участников находится в заданном отсортированном наборе (т. е. для определения его кардинальности), нужно использовать команду 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.



      Source link