Выпуск СУБД Redis 5.0
Подготовлен релиз СУБД Redis 5.0, относящейся к классу NoSQL-систем. Redis предоставляет похожие на Memcached функции для хранения данных в формате ключ/значение, расширенные поддержкой структурированных форматов данных, таких как списки, хэши и множества, а также возможностью выполнения на стороне сервера скриптов-обработчиков на языке Lua. Код проекта поставляется под лицензией BSD.
В отличие от Memcached, Redis обеспечивает постоянное хранение данных на диске и гарантирует сохранность БД в случае аварийного завершения работы. Исходные тексты проекта распространяются в рамках лицензии BSD. Клиентские библиотеки доступны для большинства популярных языков, включая Perl, Python, PHP, Java, Ruby и Tcl. Redis поддерживает транзакции, позволяющие выполнить за один шаг группу команд, гарантируя непротиворечивость и последовательность (команды от других запросов не могут вклиниться) выполнения заданного набора команд, а в случае проблем позволяя откатить изменения. Все данные в полном объёме кэшируются в оперативной памяти.
Для управления данными предоставляются такие команды, как инкремент/декремент, стандартные операции над списками и множествами (объединение, пересечение), переименование ключей, множественные выборки и функции сортировки. Поддерживается два режима хранения: периодическая синхронизация данных на диск и ведение на диске лога изменений. Во втором случае гарантируется полная сохранность всех изменений. Возможна организация master-slave репликации данных на несколько серверов, осуществляемая в неблокирующем режиме. Доступен также режим обмена сообщениями «публикация/подписка», при котором создаётся канал, сообщения из которого распространяются клиентам по подписке.
Ключевые улучшения, добавленные в Redis 5.0:
- Представлен новый тип данных Stream, который можно использовать для хранения данных в форме пополняемого лога. Записи с типом Stream могут открываться только в режиме пополнения, но допускается удаление произвольных элементов из лога и имеется возможность ограничения максимального размера лога, например, можно сохранять не больше N элементов с удалением самых старых записей по мере поступления новых. Предоставляются средства для отслеживания добавления новых элементов, осуществления различных выборок данных и применения Stream в качестве системы обработки сообщений.
Для организации совместной обработки разных частей одного потока сообщений реализована концепция Consumer Groups, при которой сообщение может снабжаться идентификатором группы и несмотря на отправку в общий поток, получить это сообщение сможет только клиент с указанным идентификатором (например, через общий поток можно организовать распределение команд среди разных обработчиков);
- Реализованы новые API для модулей: Timers, Cluster и Dictionary;
- В дампах RDB теперь сохраняется информация об алгоритмах замещения элементов LFU (Least-Frequently Used, вытеснение на основе частоты обращения к элементу) и LRU (Least Recently Used, вытеснение на основе времени последнего обращения);
- Код управления кластером переписан с Ruby (redis-trib.rb) на Си и встроен в redis-cli (доступен через команду »--cluster»);
- Реализованы новые команды ZPOPMIN и ZPOPMAX, а также их блочные вариаеты BZPOPMIN и BZPOPMAX, которые извлекают и возвращают из отсортированного набора указанное число наименьших или наибольших значений;
- Реализована вторая версия системы активной дефрагментации памяти, которая позволяет выполнять дефрагментацию налету без остановки работы, если применяется система распределения памяти Jemalloc (в Linux по умолчанию);
- Улучшена реализация алгоритма HyperLogLog;
- Расширены отчёты о состоянии памяти;
- Во многие составные команды, включающие субкоманды, добавлена встроенная подсказка (субкоманда HELP);
- Проведена оптимизация для повышения производительности в условиях частого соединения и отсоединения клиентов;
- Менеджер распределения памяти Jemalloc обновлён до версии 5.1;
- Добавлены команды: CLIENT UNBLOCK для досрочного снятия блокировки с соединения, выставленной при выполнении блокирующих операций (например BRPOP, XREAD, WAIT); CLIENT ID для получения идентификатора текущего соединения;
- Добавлена развлекательная команда LOLWUT, с реализацией пасхальных яиц, которые будут меняться в каждой новой версии Redis;
- Проведена оптимизация кода обработки сетевых соединений;
- Выполнена работа по избавлению кода от терминов «master» и «slave». Команда «SLAVEOF» переименована в «REPLICAOF», а настройка «slaveof» в «replicaof» (для обеспечения совместимости поддержка «SLAVEOF» сохранена). Поддержка признака «slave» в командах INFO и ROLE пока оставлена, так как связана с большими нарушениями совместимости (в будущем планируется предложить альтернативу INFO и заменить в ROLE «slave» на «replica»);
- Расширены возможности по созданию скриптов-обработчиков на языке Lua.
© OpenNet