Управление списками в Redis

Redis – это открытое in-memory хранилище данных типа «ключ-значение».

Список в Redis – это набор строк, отсортированных по порядку вставки (аналогично связанным спискам). В этом мануале вы узнаете, как создавать элементы в списках Redis и работать с ними.

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

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

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

Создание списков

Ключ может содержать только один список. Список может содержать более четырех миллиардов элементов. Redis читает списки слева направо. Вы можете помещать новые элементы в начало списка (его «левый» конец) с помощью команды lpush или в конец («правый» конец) с помощью rpush. Вы также можете использовать команды lpush или rpush для создания нового списка:

lpush key value

Обе команды выведут целое число, показывающее, сколько элементов существует в данном списке. Чтобы увидеть, как это работает, выполните следующие команды для создания списка, содержащего изречение «I think therefore I am»:

lpush key_philosophy1 "therefore"
lpush key_philosophy1 "think"
rpush key_philosophy1 "I"
lpush key_philosophy1 "I"
rpush key_philosophy1 "am"

Вывод последней команды будет выглядеть так:

(integer) 5

Обратите внимание: вы можете добавить в список несколько элементов с помощью одного оператора lpush или rpush:

rpush key_philosophy1 "-" "Rene" "Decartes"

Команды lpushx и rpushx также позволяют добавлять элементы в список, но только в том случае, если заданный список уже существует. Если любая из команд не может быть выполнена, она вернет (integer) 0:

rpushx key_philosophy2 "Happiness" "is" "the" "highest" "good" "–" "Aristotle"
(integer) 0

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

lset key_philosophy1 5 "sayeth"

Если вы попытаетесь добавить новый элемент к существующему ключу, который не содержит список, это приведет к конфликту типов данных и вернет ошибку. Например, следующая команда set создает ключ, содержащий строку (а не список), поэтому попытка добавить элемент списка с помощью lpush закончится ошибкой:

set key_philosophy3 "What is love?"
lpush key_philosophy3 "Baby don't hurt me"
(error) WRONGTYPE Operation against a key holding the wrong kind of value

Преобразовать ключи Redis из одного типа данных в другой невозможно. То есть, чтобы превратить key_philosophy3 в список, вам необходимо удалить этот ключ и создать его снова с помощью команды lpush или rpush.

Извлечение элементов из списка

Чтобы получить диапазон элементов в списке, используйте команду lrange, за которой укажите начальное и конечное смещение. Каждое смещение – это индекс с нулевой базой, то есть 0 является первым элементом в списке, далее идет 1, 2 и т.д.

Следующая команда вернет все элементы из нашего примера – списка, созданного в предыдущем разделе:

lrange key_philosophy1 0 7
1) "I"
2) "think"
3) "therefore"
4) "I"
5) "am"
6) "sayeth"
7) "Rene"
8) "Decartes"

Смещения, передаваемые в lrange, также могут быть выражены отрицательными числами. В этом случае -1 представляет последний элемент в списке, -2 – второй в элемент и т.д. В следующем примере команда возвращает последние три элемента списка, хранящиеся в key_philosophy1:

lrange key_philosophy1 -3 -1
1) "I"
2) "am"
3) "sayeth"

Чтобы извлечь из списка отдельный элемент, вы можете использовать команду lindex. Однако эта команда требует, чтобы вы указали индекс элемента в качестве аргумента. Как и в случае с lrange, индексация начинается с нуля, что означает, что первый элемент имеет индекс 0, второй — индекс 1 и т. д.

lindex key_philosophy1 4
"am"

Чтобы узнать, сколько элементов содержится в данном списке, используйте команду llen, которая означает «list length»:

llen key_philosophy1
(integer) 8

Если значение, хранящееся в заданном ключе, не существует, llen вернет ошибку.

Удаление элементов из списка

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

rpush key_Bond "Never" "Say" "Never" "Again" "You" "Only" "Live" "Twice" "Live" "and" "Let" "Die" "Tomorrow" "Never" "Dies"

Следующая команда lrem удалит первое вхождение значения «Live»:

lrem key_Bond 1 "Live"

Эта команда выведет количество элементов, удаленных из списка:

(integer) 1

Команде lrem также можно передавать отрицательные числа. В следующем примере команда удалит два последних вхождения значения «Never»:

lrem key_Bond -2 "Never"
(integer) 2

Команда lpop удаляет и возвращает первый – или «самый левый» — элемент из списка:

lpop key_Bond
"Never"

Чтобы удалить и вернуть последний («самый правый») элемент списка, используйте rpop:

rpop key_Bond
"Dies"

Redis также включает команду rpoplpush, которая удаляет последний элемент из списка и помещает его в начало другого списка:

rpoplpush key_Bond key_AfterToday
"Tomorrow"

Если исходный и целевой ключ, переданные команде rpoplpush, совпадают, они по сути ротируют элементы в списке.

Заключение

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

В следующем мануале мы поговорим о хэшах.

Tags: , , ,