Обзор

Redis — это сервер REmote Dictionary S, написанный на C, разработанный в 2006 году. Операции чтения и записи Redis выполняются очень быстро, поскольку он хранит данные. в памяти. Данные также могут быть сохранены на диске и записаны обратно в память. Его часто называют сервером структуры данных, потому что ключи могут содержать строки, хэши, списки, наборы, отсортированные наборы, растровые изображения и гиперлоги. Как правило, Redis невозможно использовать для очень больших наборов данных из-за требований к оборудованию. Redis имеет встроенную репликацию, сценарии Lua, вытеснение LRU, транзакции и различные уровни сохраняемости на диске. Redis — это популярный выбор для кэширования, управления сеансами, игр, списков лидеров, аналитики в реальном времени, геопространственных данных, заказа такси, чата/обмена сообщениями, потоковой передачи мультимедиа, а также публикации/дочерних приложений.

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

Структура Redis

Структура Redis состоит из часовых, мастеров и ведомых. Эту структуру можно разделить на три основных механизма:

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

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

  • Кластер. В архитектуре кластера Redis несколько узлов Redis сгруппированы для формирования распределенной системы. Данные автоматически распределяются по кластеру, и каждый узел отвечает за подмножество данных. Эта архитектура состоит из нескольких стражей, мастеров и рабов. Отличие этой архитектуры от других заключается в том, что сторожевые устройства отвечают за управление назначениями экземпляров (от главного к ведомому и наоборот), а также обеспечивают состояние сторожевого для мониторинга состояния всех экземпляров в кластере. который хранит информацию о серверах Redis в системе, включая их IP-адреса, номера портов и состояние серверов (главный, подчиненный или дозорный). В кластере может быть несколько экземпляров дозорных, но каждый дозорный имеет точно такую ​​же информацию, как и другие дозорные, потому что они обмениваются информацией друг с другом. Если один из дозорных выходит из строя, доступен другой дозорный, что позволяет обеспечить высокую доступность. Эта архитектура обеспечивает высокий уровень масштабируемости и отказоустойчивости, поскольку данные могут быть распределены по многим узлам, а аварийное переключение может выполняться автоматически в случае сбоя узла.

Структуры данных Redis

Redis очень хорошо известен своей поддержкой различных структур данных. Это очень выгодно, потому что каждая структура данных может использоваться для различных типов приложений. Например, отсортированные наборы могут использоваться игровым приложением для составления рейтинговой таблицы или HyperLogLog (который представляет собой структуру данных, которая вычисляет кардинальность данных или «количество») для подсчета, скажем, нескольких пересечений трафика в соответствии с номерные знаки, но хотите защитить личную информацию пользователя (номерные знаки). Далее я представлю структуры данных, поддерживаемые Redis:

  • Строки — последовательность символов (текст) или двоичные данные (до 512 МБ).
  • Списки — (связанные списки) линейные наборы элементов данных на основе указателей узлов в том порядке, в котором они были добавлены в
  • Наборы — неупорядоченный набор неповторяющихся строковых элементов.
  • Отсортированные наборы — наборы, связанные с оценкой, чтобы можно было поддерживать порядок.
  • Хэши — хранят сопоставление ключей со значениями, значения, которые могут храниться в хэшах, представляют собой строки и числа.
  • Растровые изображения, также известные как битовые массивы и битовые векторы, представляют собой массивы данных, в которых хранятся биты.
  • HyperLogLogs — эвристическая структура данных, используемая для подсчета уникальных элементов при очень малом объеме памяти. Недостатком является стандартная частота ошибок 1 %.
  • Потоки — структура данных только для добавления, в которой записи потока состоят из одной или нескольких пар поле-значение.
  • Геопространственные — сохраняйте именованные точки в связанных с ними координатах широты и долготы.
  • BloomFilter — пропустите элемент через функцию быстрого хэширования, выберите биты из этого хеша и установите их от 0 до 1 через определенный интервал в битовом поле. Для проверки существования в фильтре Блума отбираются одни и те же биты.

Постоянство Redis

Постоянство относится к процессу записи данных в долговременное хранилище, такое как твердотельный диск (SSD). Redis предоставляет ряд вариантов сохранения:

  1. RDB — выполняет моментальные снимки вашего набора данных через определенные промежутки времени.
  2. AOF — регистрирует каждую операцию записи, полученную сервером. Затем эти операции можно воспроизвести снова при запуске сервера, реконструируя исходный набор данных.
  3. No Persistence — полностью отключить сохранение. Это иногда используется при кэшировании
  4. RDB + AOF — объединить оба в одном экземпляре.

Данные не могут быть сохранены непосредственно в другой БД в Redis. Например, Hbase и Redis используют один и тот же тип файла (оба файла в байтах), но Redis — это моментальный снимок всей БД для восстановления, тогда как Hbase — это составной файл «ключ-значение». Следовательно, чтобы сохранить данные в другой базе данных NoSQL, необходимо иметь API для обработки и сохранения данных. Redis сохраняет данные двумя способами:

Формат RDB:

  • Двоичный формат файла, оптимизированный для быстрого хранения и извлечения данных Redis. Эта конфигурация периодически сохраняет моментальный снимок базы данных в памяти на диск в виде файла RDB (расширение → .rdb). Частоту этих снимков можно настроить с помощью «сохранения» конфигурации в файле конфигурации Redis. При сбое данные могут быть потеряны, потому что он делает снимки данных через регулярные промежутки времени. Когда Redis сохраняет данные на диск в формате RDB, данные в памяти сбрасываются на диск, а память очищается.

Формат AOF

  • Файл журнала, в котором записываются все операции записи, выполненные в базе данных Redis. Эта конфигурация добавляет каждую операцию записи в файл AOF по мере ее выполнения. Это позволяет Redis восстанавливать всю базу данных из файла AOF в случае сбоя или другого сбоя (расширение → .aof). Количество операций ввода-вывода может быть увеличено, поскольку эта конфигурация добавляется каждый раз, когда выполняется операция записи. Когда файл AOF слишком велик, Redis создает новый файл AOF. Старый не стирается до тех пор, пока минимально необходимые операции для повторного создания базы данных не будут записаны в новый файл AOF и заменены для непрерывной записи в новый файл и так далее.

Файлы AOF и RDB обычно не используются для прямого поиска ключа, они являются важными компонентами сохраняемости Redis и восстановления данных. Redis использует хеш-таблицу в памяти для быстрого поиска ключей и доступа к данным, но если данных нет в памяти, Redis загрузит их из файла AOF или RDB, чтобы восстановить их в памяти.

Некоторые из преимуществ использования этих двух файлов:

  1. Более быстрое время перезапуска. Время перезапуска может быть меньше по сравнению с необходимостью перестраивать набор данных с нуля.
  2. Резервные копии данных — используется для создания регулярных резервных копий набора данных Redis.
  3. Репликация — подчиненные экземпляры могут использовать файлы AOF и RDB для восстановления набора данных из главного экземпляра.
  4. Оптимизация памяти — удаление ключей, к которым редко обращаются, путем применения политики LRU.

Хотя основная цель файлов AOF и RDB — сохранение и восстановление данных, они предоставляют дополнительные преимущества, которые могут повысить производительность, надежность и масштабируемость развертывания Redis.

Еще один любопытный факт заключается в том, что файл Redis .rdb и файл HBase .hfile являются форматами двоичных файлов, используемых для хранения данных в соответствующем хранилище данных. Однако файл Redis .rdb представляет собой снимок базы данных Redis в определенный момент времени. Он содержит все данные экземпляра Redis, сериализованные в двоичном формате. С другой стороны, HBase .hfile — это формат файла, используемый для хранения данных в распределенной базе данных HBase. Он содержит блок пар ключ-значение, где ключи отсортированы в определенном порядке для обеспечения эффективного поиска. Плюс HBase распространял свой файл по HDFS.

Индексация Redis

Redis поддерживает несколько структур данных, управляемых хеш-таблицей с временной сложностью O(1). Поскольку хеш-ключи получаются из хеш-функций, значения, генерируемые функциями, всегда будут одинаковыми, поскольку эти функции известны как детерминированные. В Redis это выгодно, потому что благодаря этой оптимизации данные можно записывать или читать очень быстро. В Redis вставляется структура данных, как показано ниже, и пользователю необходимо указать тип структуры данных (набор, хэш, строка и т. д.). Эта структура данных сначала предварительно обрабатывается из соответствующего файла структуры данных. Затем из dict.c генерируется ключ и в конечном итоге добавляется в хеш-таблицу для дальнейшего управления ею.

Редис против других систем

Memcached — это высокопроизводительный сервис кэширования распределенной памяти, разработанный для простоты. Redis предлагает богатый набор функций, которые делают его эффективным для широкого спектра вариантов использования.

  • Задержка менее миллисекунды — и Redis, и Memcached поддерживают время отклика менее миллисекунды. Сохраняя данные в памяти, они могут считывать данные быстрее, чем базы данных на дисках.
  • Простота использования для разработчиков. И Redis, и Memcached синтаксически просты в использовании и требуют минимального объема кода для интеграции в ваше приложение.
  • Разделение данных. И Redis, и Memcached позволяют распределять данные между несколькими узлами. Это позволяет выполнять масштабирование, чтобы лучше обрабатывать больше данных при росте спроса.
  • Поддержка широкого набора языков программирования. И Redis, и Memcached имеют множество клиентов с открытым исходным кодом, доступных для разработчиков. Поддерживаемые языки включают Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, Go и многие другие.
  • Расширенные структуры данных. Помимо строк, Redis поддерживает списки, наборы, отсортированные наборы, хэши, битовые массивы и гиперлоги. Приложения могут использовать эти более сложные структуры данных для поддержки различных вариантов использования. Например, вы можете использовать Redis Sorted Sets, чтобы легко реализовать таблицу лидеров игры, в которой хранится список игроков, отсортированных по их рангу.
  • Многопоточная архитектура. Поскольку Memcached является многопоточным, он может использовать несколько вычислительных ядер. Это означает, что вы можете выполнять больше операций за счет увеличения вычислительной мощности.
  • Снимки. С помощью Redis вы можете хранить свои данные на диске с моментальным снимком на определенный момент времени, который можно использовать для архивирования или восстановления.
  • Репликация — Redis позволяет создавать несколько реплик первичного сервера Redis. Это позволяет масштабировать операции чтения базы данных и иметь высокодоступные кластеры.
  • Транзакции — Redis поддерживает транзакции, которые позволяют выполнять группу команд как изолированную и атомарную операцию.
  • Pub/Sub — Redis поддерживает обмен сообщениями Pub/Sub с сопоставлением шаблонов, который можно использовать для высокопроизводительных чатов, потоков комментариев в реальном времени, каналов социальных сетей и взаимодействия с сервером.
  • Сценарии Lua — Redis позволяет выполнять транзакционные сценарии Lua. Скрипты могут помочь вам повысить производительность и упростить приложение.
  • Геопространственная поддержка — в Redis есть специальные команды для работы с геопространственными данными в реальном времени в любом масштабе. Вы можете выполнять такие операции, как определение расстояния между двумя элементами (например, людьми или местами) и поиск всех элементов в пределах заданного расстояния от точки.

Другие точки сравнения:

тип данных

  • Memcached: поддерживает только String, размер данных ключа и значения ограничен, обычно 1M
  • Redis: ключ должен быть строкой, но значение поддерживает расширенные типы данных, такие как строка, список и набор. Ограничение на размер данных намного больше, чем у Memcached, обычно от 500 МБ до 1 ГБ.
  • MongoDB: принимает структуру, подобную JSON (bson), поддерживает типы данных, которые может выражать jJSON, такие как null, boolean, numeric, string и т. д., а максимальное ограничение для одного документа составляет 16M.
  • HBase: использовать семейство столбцов, базовые данные используют массив байтов, каждый блок хранения имеет ограничение на размер данных, настраиваемый, поддерживается не менее 64 МБ.

производительность

  • Memcached: автономные, многопоточные и распределенные приложения должны полагаться на клиента для последовательного хэширования и других элементов управления.
  • Redis: поддержка синхронизации master-slave, поддержка кластера, один поток
  • MongoDB: первые два — In-Memory, поэтому MongoDB здесь должен немного пострадать, и, возможно, более уместно сравнить его с MySql. Поддержка режима «ведущий-ведомый» и поддержка горизонтального распределенного расширения на основе сегментирования.
  • HBase: серверная часть — HDFS.

Обычное использование

  • Memcached: ускоряет доступ к данным в качестве уровня кэша для реляционных баз данных.
  • Redis: в качестве кэш-уровня реляционной базы данных он ускоряет доступ к данным; в то же время он обеспечивает функцию посадки данных
  • MongoDB: база данных без схемы, используемая для замены MySql в сценариях с быстрыми изменениями и низкими требованиями к транзакциям, например, для хранения игровой информации о пользователях и социальной информации.
  • HBase: хранилище больших данных, сценарии, требующие большого количества одновременных запросов, таких как журналы.

Рекомендации

  1. https://redis.io/docs/
  2. https://redis.com/
  3. https://aws.amazon.com/redis/ [Amazon Redis]
  4. https://www.educative.io/courses/complete-guide-to-redis/x1OYkn7B8mB
  5. https://www.slideshare.net/Byungwook/redis-data-modeling-examples
  6. https://algodaily.com/lessons/redis-intro-and-use-cases-cheat-sheet
  7. https://github.com/redis/redis