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.
В следующем мануале мы поговорим о хэшах.