Управление наборами в Redis

Redis – это открытое in-memory хранилище типа «ключ-значение». Набор (или множество) в Redis – это коллекция строк, хранящаяся в определенном ключе. Отдельное значение в наборе называется членом. В отличие от списков, наборы неупорядочены и не могут содержать двух одинаковых значений.

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

Как работать с этим мануалом

Это руководство задумано как шпаргалка с примерами. Его не нужно выполнять последовательно – вы можете просто перейти к любому разделу, который имеет отношение к нужной вам задаче.

Команды, использованные в этом мануале, были протестированы на сервере Ubuntu 18.04 и экземпляре Redis версии 4.0.9. Чтобы настроить аналогичную среду, вы можете следовать разделу 1 руководства Установка и защита Redis в Ubuntu 18.04. Мы покажем, как эти ведут себя команды в redis-cli, интерфейсе командной строки Redis. Обратите внимание, что если вы используете другой интерфейс Redis — например, Redli – то вывод некоторых команд будет отличаться.

Создание набора

С помощью команды sadd можно создать набор и добавить в него один или несколько членов. Для примера попробуйте создать набор с ключом key_horror и членами «Frankenstein» и «Godzilla»:

sadd key_horror "Frankenstein" "Godzilla"

Если все прошло успешно, команда вернет целое число, которое отображает количество добавленных в набор членов.

(integer) 2

Если вы попытаетесь добавить члены набора к ключу, который уже содержит ненулевое значение, он вернет ошибку. Первая команда в следующем блоке создает список key_action с одним элементом, «Shaft». Следующая команда пытается добавить член «Shane» в список, но это приводит к ошибке из-за конфликтующих типов данных:

rpush key_action "Shaft"
sadd key_action "Shane"
(error) WRONGTYPE Operation against a key holding the wrong kind of value

Читайте также: Управление списками в Redis

Обратите внимание, что наборы не допускают более одного вхождения одного и того же члена:

sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"
(integer) 4

Несмотря на то, что команда sadd содержит восемь членов, она отбрасывает повторы члена «Mad», в результате чего размер в наборе остается 4 члена.

Извлечение членов из наборов

В этом разделе мы рассмотрим ряд команд Redis, которые возвращают информацию о членах в наборе. Чтобы попрактиковаться, выполните следующую команду, которая создаст набор с шестью членами в ключе key_stooges:

sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"

Чтобы вывести на экран все члены набора, введите команду smembers и укажите ключ, который вы хотите проверить:

smembers key_stooges
1) "Curly"
2) "Moe"
3) "Larry"
4) "Shemp"
5) "Curly Joe"
6) "Joe"

Чтобы узнать, является ли определенное значение членом набора, используйте команду sismember:

sismember key_stooges "Harpo"

Если элемент «Harpo» является членом набора key_stooges, sismember вернет 1. В противном случае команда вернет 0:

(integer) 0

Чтобы узнать, сколько членов входит в заданный набор (другими словами, чтобы определить количество элементов данного набора), запустите команду scard, указав ключ:

scard key_stooges
(integer) 6

Чтобы вернуть случайный элемент из набора, используйте команду srandmember:

srandmember key_stooges

Чтобы вернуть несколько разных случайных элементов из набора, вы можете выполнить команду srandmember и указать количество элементов, которое вы хотите получить:

srandmember key_stooges 3
1) "Larry"
2) "Moe"
3) "Curly Joe"

Если вы передадите srandmember отрицательное число, команда сможет возвращать один и тот же элемент несколько раз:

srandmember key_stooges -3
1) "Shemp"
2) "Curly Joe"
3) "Curly Joe"

Функция вывода случайного элемента в srandmember становится более производительной в больших наборах данных. Читайте официальную документацию команды.

Удаление членов из наборов

Redis поставляется с тремя командами для удаления членов из набора: spop, srem и smove.

Команда spop случайным образом выбирает указанное число членов и возвращает их, как srandmember, но затем удаляет их из набора. В качестве аргументов он принимает имя ключа, содержащего набор, и количество элементов, которые необходимо удалить из набора. Если вы не укажете число, spop по умолчанию вернет и удалит одно значение.

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

spop key_stooges 2
1) "Shemp"
2) "Larry"

Команда srem позволяет удалить один или несколько определенных (а не случайных) членов из набора:

srem key_stooges "Joe" "Curly Joe"

Вместо того чтобы возвращать сами элементы, удаленные из набора, srem возвращает целое число, показывающее, сколько элементов было удалено:

(integer) 2

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

smove key_stooges key_jambands "Moe"

Если команда успешно переместила элемент, она вернет:

(integer) 1

Если smove не удается переместить элемент, она возвращает (integer) 0. Обратите внимание, если целевой ключ еще не существует, smove создаст его самостоятельно, а затем переместит в него элемент.

Сравнение наборов

Redis также предоставляет ряд команд, которые находят различия и сходства между наборами. Чтобы посмотреть, как они работают, давайте создадим три набора: presidents, kings и beatles. Создайте эти наборы и заполните их, используя следующие команды sadd:

sadd presidents "George" "John" "Thomas" "James"
sadd kings "Edward" "Henry" "John" "James" "George
sadd beatles "John" "George" "Paul" "Ringo"

Команда sinter сравнивает различные наборы и возвращает сходства наборов – то есть те значения, которые появляются в каждом наборе:

sinter presidents kings beatles
1) "John"
2) "George"

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

sinterstore new_set presidents kings beatles
smembers new_set
1) "John"
2) "George"

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

sdiff presidents kings beatles
1) "Thomas"

Другими словами, sdiff просматривает все члены в первом заданном наборе, а затем сравнивает их с членами в каждом последующем наборе. Любой член в первом наборе, который также появляется в следующих наборах, удаляется, и в результате sdiff возвращает оставшиеся члены. По сути, она учаляет члены последующих наборов из первого набора.

Функция команды sdiffstore аналогична sdiff, но вместо вывода разности наборов она создает в заданном целевом ключе новый набор, содержащий эту разность:

sdiffstore new_set beatles kings presidents
smembers new_set
1) "Paul"
2) "Ringo"

Как и sinterstore, команда sdiffstore перезапишет целевой ключ, если он уже существует.

Команда sunion возвращает объединение наборов – то есть набор, содержащий каждый член каждого указанного набора:

sunion presidents kings beatles
1) "Thomas"
2) "George"
3) "Paul"
4) "Henry"
5) "James"
6) "Edward"
7) "John"
8) "Ringo"

Команда sunion рассматривает результаты как новый набор, поскольку она допускает только одно вхождение каждого элемента.

Команда sunionstore выполняет аналогичную функцию, но не просто возвращает результаты, а создает в заданном месте новый набор, содержащий объединение наборов:

sunionstore new_set presidents kings beatles
(integer) 8

Как и команды sinterstore и sdiffstore, sunionstore перезапишет содержимое целевого ключа, если он уже существует.

Заключение

В этом мануале мы подробно рассмотрели ряд команд для создания и управления наборами в Redis.

Читайте также: Устранение неполадок в Redis

Tags: , , ,