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 и потренироваться отправлять запросы, редактировать и обрабатывать базу данных. Чтобы это сделать, нужно иметь минимальное представление, как работают контейнеры и развертывание программ в них — основы изучить несложно.
Другие термины на «R»
Все термины
0 комментариев