[БЕЗ_ЗВУКА] Всем привет! В этом видео мы продолжим разбирать типы данных Redis, и следующий тип данных в Redis — это списки. Внутри они реализованы как linked lists. Это означает, что добавление элементов в начало или конец списка очень быстрое и не зависит от общего количества элементов, уже имеющихся в списке. А вот обращение по индексу элемента может оказаться не столь быстрым и зависит от этого индекса. Давайте попробуем создать список. Для этого есть команда rpush, которая добавляет элемент в список. Давайте попробуем, rpush list 1, rpush list 2, rpush list 3 4 5 6, можно одновременно несколько значений добавить. Получить весь список можно с помощью команды lrange, которой передаются два параметра: индекс первого элемента и индекс второго. Индексы начинаются с нуля, и если индекс отрицательный, то он отсчитывается, наоборот, от конца списка. То есть последний элемент в списке имеет индекс −1, предпоследний −2 и так далее. Таким образом, чтобы получить весь список, мы можем написать команду lrange, передав ей в качестве ключа название нашего ключа, с 0-го по −1-й элемент. И вот содержимое всего нашего списка. Можно извлекать элементы из списка, из его начала или из его конца. Для этого есть команды lpop и rpop. Давайте возьмем элемент из начала списка и давайте возьмем элемент из конца списка. Если все элементы закончатся в списке, то она просто будет возвращать ничего. Есть также блокирующие варианты команд lpop и rpop, есть brpop и blpop. Они работают точно так же, только у них есть еще второй параметр, который указывает, сколько времени ждать. И если список пустой, они не возвратят сразу эту пустоту, а будут ждать, пока кто-нибудь в него не запишет или пока не выйдет тот таймаут, который вы указали. Это удобно для реализации очередей на Redis. Также вы могли заметить, что Redis автоматически создает ключ с привязанным к нему пустым списком при первой операции с этим списком. То есть у нас не было на самом деле никакого ключа list, и мы начали добавлять туда значения сразу, и при этом Redis автоматически создал этот ключ и создал в нем пустой список и потом уже добавил первое значение. Точно так же, когда мы удалили все значения из списка, этот ключ Redis также автоматически удалился. Это легко проверить с помощью команды exists. То есть вот у нас был этот лист, сейчас мы смотрим — и его нет. А если мы сделаем rpush какого-нибудь значения в него, у нас автоматически он создался, этот ключ. Давайте перейдем к следующему типу данных, и следующим типом данных в Redis являются хеши. Они очень похожи на питонячьи хеши, позволяют под одним ключом сохранить несколько значений как бы со своими ключами. Давайте попробуем. Есть, например, команда hmset, которая позволяет установить сразу несколько ключей внутри хеша. Создадим хеш book и, допустим, поместим в него парочку полей, title и, допустим, год издания. Вот мы создали хеш с двумя полями. Также мы можем получить все значения, hgetall, и он вернет нам все значения ключей и все значения значений этих. Можно добавить только один элемент, соответственно, hset, давайте добавим рейтинг со значением 100, и есть команда, которая позволяет работать со значениями внутри хеша отдельно. Например, мы можем увеличить этот рейтинг с помощью команды hincrby, соответственно, book rate, на 10. Давайте перейдем к следующему типу данных — это множества, или sets. Множества в Redis — это неупорядоченная коллекция строк. И можно добавлять, извлекать, проверять вхождение строки в это множество, и есть ряд операций над всем множеством, таких как пересечение двух множеств, объединение. Важно, что множества содержат только уникальные значения. Для работы с множеством есть команда sadd, которая позволяет добавить элементы в множество, точно так же можно добавить один или несколько, допустим, добавим в множество элементы 1, 2 и 3. И чтобы показать, что там содержатся только уникальные значения, давайте добавим в него еще 2, 3 и 4. С помощью команды smembers мы можем получить все элементы множества. Посмотрим и убедимся, что здесь только уникальные из добавленных нами сохранились. Давайте проверим вхождение элемента во множество. Для этого есть команда sismember, myset. Ну и посмотрим, например, элемент 3 есть в множестве, а элемента 30 нет. Соответственно, есть другие команды, spop, которая извлекает элемент из множества, случайный причем. Давайте извлечем какие-нибудь элементы. И есть команда, например, для пересечения множеств — это sinter. Давайте создадим, вернем myset [ЗВУК] и создадим какое-нибудь второе множество. И с помощью команды [ЗВУК] найдем их пересечение. Как видите, легко найти. И последний тип данных, самый мощный в Redis, — это упорядоченные множества. Они похожи на обычные множества в том смысле, что тоже хранят уникальные строки, но, помимо этого, вместе со строкой они сохраняют параметр score, по которому эти строки будут отсортированы. То есть эти множества упорядочены, заранее отсортированы. Если у двух элементов одинаковый score, то эти элементы будут отсортированы лексикографически. Давайте попробуем создать множество, для этого есть команда zadd, которая добавляет в него элементы. Допустим, указываем score и, собственно говоря, саму строку, которую мы сохраняем. Давайте попробуем добавить еще, кстати, можно перетирать. Но сейчас мы добавили два одинаковых значений. Давайте посмотрим теперь, что же у нас получилось. Для этого мы можем использовать команду zrange, zrange и, собственно, указать user с какого и по какой, так же, как и в обычной команде range. Вот у нас были отсортированы они по score, а при одинаковом score — лексикографически. Давайте добавим еще парочку пользователей. Допустим, Pavel. Смотрите, мы дали ему score меньше, и он должен встать перед Petr и Pert. И добавим кого-нибудь в конец, цифра семь. [ЗВУК] Посмотрим. И как видите, Pavel у нас встал перед Petr, а Matvey встал в конец. И самая, наверное, мощная команда, которая есть, позволяет получить из множества строки, у которых score лежит в каком-то диапазоне, — это zrangebyscore. [ЗВУК] Соответственно, она принимает ключ, минимальное и максимальное значение score, внутри которого мы будем отбирать, допустим, от двух до шести. Можем добавить опцию withscores, она позволяет получить не только значения строк, но и значения их score. И можно добавить limit, например, с какого индекса и сколько штук, например, 0 1. И мы получили Pavel, а если мы здесь допишем 1 1, то мы получим Pert. Если мы сотрем limit, то мы получим всех пользователей, у которых score лежит в нужном диапазоне. Вот так это работает. Это самая мощная, наверное, команда Redis. Как вы видите, даже самые продвинутые операции, все-таки они примитивнее, чем можно сделать с помощью SQL. Тем не менее и с этим можно сделать довольно многое, а главное — это работает все очень быстро и отлично масштабируется. Если вам показались интересными возможности Redis, советую заглянуть в его документацию, потому что я, конечно, озвучил далеко не все. А на следующей неделе вы начнете знакомство с веб-фреймворками. [ЗВУК] [БЕЗ_ЗВУКА]