Баннер мобильный (1) Пройти тест

Redis

Глоссарий

21 сентября 2023

Поделиться

Скопировано

Содержание

    Redis — это система управления базами данных, которая хранит информацию в виде пар ключ-значение. Ключ — это название какого-то поля, а значение — его содержание. 

    По сути, это сервер, где хранятся структуры данных, в первую очередь так называемые словари. Это видно и в названии системы: Redis расшифровывается как Remote Dictionary Server, то есть удаленный сервер словарей.

    Redis Server — нереляционная СУБД. Это значит, что информацию она хранит не в виде связанных двумерных таблиц, а организует ее иначе. Поэтому Redis быстрее и удобнее стандартных баз, но не так надежен и используется в основном как вспомогательная система.

    По-русски систему называют «редис» с ударением на первый слог. На сленге разработчиков — «редис» с ударением на второй слог, как овощ.

    Для чего нужен Redis

    СУБД нужны, чтобы управлять данными, которые хранятся в базах. Система управления помогает запрашивать данные из базы, изменять их, отправлять в хранилище, объединять и делать многое другое.

    Конкретно Redis обычно применяют, чтобы:

    • хранить данные сессии пользователя — например, введенный, но не отправленный текст;
    • кэшировать информацию из основной СУБД, чтобы снизить на нее нагрузку;
    • хранить промежуточные данные, у которых короткий «срок жизни», например результаты ответов на квиз;
    • передавать сообщения — система может хранить их и пересылать получателю;
    • управлять базами данных маленьких приложений и сайтов-одностраничников.

    Еще Redis используют в системах, где очень критична скорость. Например, на финансовых биржах, где задержки в обновлениях курсов могут привести к денежным потерям. Там СУБД используется для хранения быстрых данных, которые как раз нужно передавать с максимальной скоростью. Но как основную базу Redis применяют редко.

    Кто работает с Redis

    Обычно — бэкендеры и администраторы СУБД, иногда другие специалисты, которые работают с «серверной» частью проектов. Разработчикам, которые имеют дело с этим сервером, желательно знать язык Lua: на нем системе отдают команды и запросы вместо привычного SQL.

    Чем Redis отличается от реляционных СУБД

    Классические системы управления базами данных вроде Oracle или MySQL — реляционные. Они хранят информацию в виде двумерных таблиц и систем отношений между ними. Разработчики обращаются к СУБД с помощью языка запросов SQL, получают или отправляют данные. Но запрос нужно сформировать, а информацию, которую вернула база, — перебрать, чтобы превратить в читаемую структуру данных на каком-то языке программирования.

    Redis же напрямую хранит данные в виде структур, причем информацию он удерживает в оперативной памяти сервера, а не на жестком диске. Это дает ряд отличий от традиционных СУБД.

    Быстрее проходят операции. Обращение к оперативной памяти в принципе быстрее, чем чтение или запись на жесткий диск или SSD-накопитель. Поэтому ускоряется вся система и в конечном итоге — весь продукт.

    Гибче работа с базой. Двумерная реляционная таблица — довольно жесткая структура, и работать с ней надо по определенным правилам. Структуры данных в Redis более гибкие, и у разработчика больше свободы в том, как ими управлять. Это помогает реализовать больше интересных решений.

    Нет языка SQL. Redis — noSQL СУБД. Это значит, что язык запросов SQL там не используется. Вместо него СУБД применяет скрипты на языке Lua, который специально спроектирован очень простым и поэтому легок в изучении.

    Ниже целостность данных. В отличие от реляционных баз данных, Redis не соответствует критериям ACID, которым должна отвечать основная БД проекта. Это набор правил: атомарность, непротиворечивость, изолированность, стойкость. Проще говоря, данные не так хорошо защищены от повреждений, как в более традиционных СУБД. Поэтому Redis редко используют как основную базу.

    Как устроен Redis

    Давайте разберемся, что такое Redis изнутри и как он работает с информацией. Система опенсорсная и полностью бесплатная, поэтому любой может посмотреть ее исходный код или скачать, чтобы запустить со своего устройства. Но сначала стоит изучить основы.

    Структуры и типы данных. Изначально Redis поддерживал только списки — структуры данных, где информация хранится в виде пар «ключ-значение». Сейчас его возможности намного шире. В нем поддерживаются:

    • строки — данные в формате текста;
    • множества — неупорядоченные наборы уникальных значений;
    • упорядоченные множества;
    • списки — упорядоченные структуры, где данные пронумерованы;
    • битовые массивы — структуры, где данные хранятся в двоичном виде;
    • битовые поля — структуры, которые позволяют получать доступ к отдельным битам данных;
    • хеш-таблицы — специальные структуры для хранения пар «ключ-значение», обычно хешей;
    • геопространственные данные — координаты каких-то точек на карте;
    • HyperLogLog — вероятностная структура для хранения большого количества уникальных данных, которые занимают константный объем памяти;
    • потоки — структуры данных, доступные только для добавления новой информации. Информация в потоке становится общедоступной для пользователей.

    Благодаря разнообразию системой можно гибко управлять, настраивать и относительно легко работать с информацией. Кроме того, Redis поддерживает разные продвинутые функции СУБД. Рассмотрим их подробнее.

    Команды. В Redis есть команды для работы со всеми перечисленными выше типами данных. Команды простые, обычно состоят из одного или двух слов, по каждой из них есть руководство в официальной документации. Например, HGET получает данные из хеш-таблицы, а EXEC выполняет все запросы в очереди.

    Транзакции. Транзакция в управлении базами данных — это последовательный набор операций, который выполняется целиком или не выполняется вообще. Redis поддерживает механизм транзакций, но с оговоркой: если какая-то команда не выполнится, остальные все равно могут выполниться. Это может нарушить целостность данных — например, фамилия записалась, а имя нет, в итоге в данных остается пробел.

    Подписки. Еще одна интересная возможность Redis Server — реализация механизма подписок. Один клиент может создать канал, а другой — подписаться на него и получать сообщения. Эту возможность используют, например, для оповещений о событиях или для создания чатов. У одного канала может быть много подписчиков. Механизм не гарантирует, что конкретный подписчик получит сообщение, и не может предсказать, кто именно его прочитает.

    Долговременное хранение. Хотя Redis в основном хранит информацию в памяти, у него есть несколько механизмов для хранения данных на диске. Это в основном резервные копии, потому что для постоянного и надежного хранения данных в памяти Redis попросту не предназначен. Механизмов три:

    • RDB — создание «снимков базы», которые описывают ее полное состояние в какой-то момент. Можно задать автоматическое создание снимка раз в определенный промежуток времени. Но если до автоматического снимка произошел сбой, можно потерять данные;
    • AOF — ведение «журналов операций», куда записывается информация о каждом действии с базой. Журналы независимы друг от друга, обновляются каждую секунду и хранятся на диске;
    • RDB + AOF — комбинация обоих способов считается самой надежной.

    Долговременное хранение можно отключить вовсе, потому что Redis ориентирован на скорость, а не на надежность. Но так стоит делать, только если в базе хранятся данные, которые не страшно потерять, вроде кэша.

    Конфигурации Redis

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

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

    Redis HA. HA означает High Availability — высокая доступность. Это система, которая состоит из двух баз Redis: основной и зависимой. Ведущая база принимает запросы и записывает данные, а зависимая используется как резервная копия. С помощью репликации данных вся информация передается туда. В итоге, если какая-то из баз откажет, вторая сможет ее заменить — выше надежность всей системы.

    Redis Sentinel. Уже более сложная структура — распределенная система. В ней существует основная база, одна или несколько подчиненных, а еще sentinel-узлы. Sentinel-узлы занимаются координацией работы базы: реагируют на сбои, проверяют доступность остальных баз, мониторят и отправляют уведомления. Они же помогают восстановить систему после сбоя и указывают новым клиентам, какой экземпляр базы сейчас ведущий.

    Redis Cluster. Самая сложная из всех конфигураций — кластер. Это горизонтальная сеть, где участвует множество клиентов и пар «ведущий-зависимый узлы». Кроме репликации, тут используется шардирование: равномерное распределение данных по всем узлам, которое помогает снижать нагрузку на серверы. Подходит, если базу, например, нужно разделить на несколько устройств. Для мониторинга используется отдельный протокол gossip.

    Преимущества Redis

    • Высокая скорость — главная причина популярности СУБД среди разработчиков.
    • Производительность — может обрабатывать миллионы запросов за секунду.
    • Поддержка репликации и шардирования — можно создавать распределенные системы и масштабировать их.
    • Работа с разными структурами данных — это дает больше гибкости при разработке.
    • Возможность делать «снимки» базы и обеспечивать персистентность, то есть фактически контроль версий.
    • Реализация паттерна проектирования «издатель-подписчик» благодаря механизму подписок.
    • Многообразие конфигураций — можно запустить и для маленького приложения, и для большой системы.

    Недостатки Redis 

    • Проблемы с долгосрочной записью на диск — в основном Redis хранит информацию в памяти, а при создании «снимка» базы может «потерять» часть сведений.
    • Необходимость выбирать между скоростью и надежностью — можно включить персистентность данных, чтобы информация не терялась но это снижает производительность.
    • Дороговизна хранения — хранить данные в оперативной памяти более дорого и ресурсоемко, чем на диске. К тому же есть технические ограничения на размер такого хранилища.

    Как начать пользоваться Redis

    Самый простой способ — развернуть единичный экземпляр базы в Docker-контейнере. Там можно будет открыть консоль Redis и потренироваться отправлять запросы, редактировать и обрабатывать базу данных. Чтобы это сделать, нужно иметь минимальное представление, как работают контейнеры и развертывание программ в них — основы изучить несложно.

    Поделиться

    Скопировано

    0 комментариев

    Комментарии