RedisTimeSeries
RedisTimeSeries — это модуль расширения для системы управления базами данных Redis, предназначенный для эффективной работы с временными рядами (time series). Он добавляет в Redis специализированный тип данных, оптимизированный для хранения, обработки и анализа последовательностей данных, упорядоченных по времени. Модуль обеспечивает высокую производительность при записи и чтении метрик, поддерживает агрегацию, сжатие, downsampling (понижение частоты дискретизации) и автоматическое удаление устаревших данных.
История
Разработка RedisTimeSeries была начата компанией Redis Labs (ныне Redis Ltd.) для расширения функциональности Redis в сфере IoT (Интернет вещей), мониторинга, финансов и других областях, где требуется работа с потоками временных данных. Первая публичная версия модуля была выпущена в 2018 году. В 2020 году RedisTimeSeries стал частью коммерческого предложения Redis Enterprise, а затем был включён в состав Redis Stack — пакета, объединяющего несколько модулей Redis для упрощения развёртывания. Исходный код модуля распространяется под лицензией Redis Source Available License (RSAL), что накладывает определённые ограничения на его коммерческое использование.
Ключевые характеристики
Тип данных и структура
В отличие от стандартных строк, списков или множеств Redis, RedisTimeSeries использует специализированную структуру данных — временной ряд. Каждая точка данных (sample) в ряду представляет собой пару «метка времени — значение». Метка времени может быть задана в миллисекундах или микросекундах. Значение хранится в виде числа с плавающей запятой двойной точности (double).
Временные ряды в RedisTimeSeries могут быть организованы в виде ключей, аналогично другим типам данных Redis. Каждый ключ может содержать один временной ряд. Для идентификации рядов используются метки (labels) — пары «ключ-значение», которые позволяют группировать и фильтровать данные (например, sensor_id:123, location:room1).
Производительность
RedisTimeSeries оптимизирован для высокоскоростной записи. Модуль способен обрабатывать миллионы операций записи в секунду на одном узле, что достигается за счёт использования внутренних структур данных, минимизирующих накладные расходы. Операции чтения и агрегации также выполняются быстро, особенно при использовании индексов по меткам.
Сжатие данных
Для экономии памяти модуль поддерживает сжатие временных рядов. Алгоритмы сжатия (например, с использованием разностного кодирования и кодирования переменной длины) позволяют значительно сократить объём хранимых данных, особенно при записи с высокой частотой. Сжатие настраивается для каждого ряда индивидуально.
Правила устаревания (Retention)
Для управления объёмом данных RedisTimeSeries позволяет задавать политики устаревания (retention policy). Можно указать максимальное время хранения данных (TTL) для каждого ряда. Данные, превышающие этот лимит, автоматически удаляются, что предотвращает неограниченный рост базы данных.
Агрегация и Downsampling
Одной из ключевых функций является возможность выполнения агрегации данных за определённые временные окна. Модуль поддерживает следующие агрегатные функции:
- AVG — среднее значение.
- SUM — сумма.
- MIN — минимальное значение.
- MAX — максимальное значение.
- RANGE — размах (максимум минус минимум).
- COUNT — количество точек данных.
- STD.P — стандартное отклонение по генеральной совокупности.
- STD.S — стандартное отклонение по выборке.
- VAR.P — дисперсия по генеральной совокупности.
- VAR.S — дисперсия по выборке.
- FIRST — первое значение.
- LAST — последнее значение.
- TWAP — средневзвешенное по времени (Time-Weighted Average Price).
- TWA — среднее по времени (Time-Weighted Average), аналогично TWAP.
Downsampling (понижение частоты дискретизации) позволяет автоматически преобразовывать высокочастотные данные в низкочастотные, сохраняя агрегированные значения за заданные интервалы (например, суммировать показания датчика за каждую минуту). Это полезно для долгосрочного хранения и анализа трендов.
Запросы и фильтрация
RedisTimeSeries предоставляет мощный язык запросов, основанный на командах Redis. Запросы могут включать:
- Фильтрацию по меткам (labels) с использованием логических операторов (
==,!=,=~(regex),!~). - Указание временного диапазона (от и до).
- Применение агрегатных функций.
- Группировку результатов по меткам.
- Сортировку и лимитирование результатов.
Команды
Модуль добавляет в Redis набор команд для управления временными рядами. Основные из них:
- TS.CREATE — создаёт новый временной ряд с указанными параметрами (метки, политика устаревания, размер чанка, алгоритм сжатия).
- TS.ADD — добавляет одну или несколько точек данных в ряд. Может автоматически создавать ряд, если он не существует.
- TS.GET — получает последнюю точку данных из ряда.
- TS.MGET — получает последние точки данных из нескольких рядов, отфильтрованных по меткам.
- TS.RANGE — выполняет запрос на получение точек данных за указанный временной диапазон с возможностью агрегации.
- TS.MRANGE — выполняет запрос на получение данных из нескольких рядов за временной диапазон.
- TS.INCRBY / TS.DECRBY — атомарно увеличивает или уменьшает значение последней точки данных (полезно для счётчиков).
- TS.ALTER — изменяет параметры существующего временного ряда (например, политику устаревания).
- TS.DEL — удаляет точки данных за указанный временной диапазон.
- TS.INFO — возвращает метаданные о временном ряде (количество точек, размер, метки и т.д.).
Применение
RedisTimeSeries находит применение в различных областях, где требуется обработка потоковых данных:
- Мониторинг инфраструктуры (DevOps): сбор метрик с серверов, контейнеров (Docker, Kubernetes), приложений (CPU, память, сетевой трафик, задержки). Позволяет строить панели мониторинга в реальном времени.
- Интернет вещей (IoT): обработка показаний датчиков (температура, влажность, давление, вибрация) от тысяч устройств. Используется для выявления аномалий, прогнозирования отказов и управления устройствами.
- Финансовые технологии (FinTech): хранение и анализ котировок, цен акций, курсов валют, объёмов торгов. Применяется для построения графиков, расчёта скользящих средних и других технических индикаторов.
- Аналитика приложений: отслеживание пользовательских событий (клики, просмотры страниц, время сессии), метрик производительности (время загрузки, частота ошибок) и бизнес-показателей (DAU, MAU, конверсия).
- Телекоммуникации: сбор и анализ данных о сетевом трафике, качестве обслуживания (QoS), использовании пропускной способности.
- Научные исследования: обработка данных с научных приборов, метеостанций, сейсмографов.
Интеграция
RedisTimeSeries может использоваться с различными инструментами и библиотеками:
- Prometheus: через специальный адаптер (redis-tsdb-adapter) RedisTimeSeries может выступать в качестве долгосрочного хранилища для метрик Prometheus.
- Grafana: модуль имеет встроенную поддержку в Grafana, что позволяет строить дашборды и визуализировать данные напрямую из Redis.
- Telegraf: агент для сбора метрик может отправлять данные в RedisTimeSeries.
- Клиентские библиотеки: существуют библиотеки для популярных языков программирования, включая Python (redistimeseries), Java (Jedis, Lettuce), Node.js (node-redis), Go (go-redis), C#, Ruby и другие.
Ограничения
Несмотря на высокую производительность, RedisTimeSeries имеет некоторые ограничения:
- Оперативная память: как и Redis в целом, модуль хранит данные преимущественно в оперативной памяти. Хотя сжатие и политики устаревания снижают потребление памяти, для очень больших объёмов данных (терабайты) это может быть дорогостоящим решением по сравнению с дисковыми базами данных.
- Отсутствие сложных SQL-запросов: язык запросов RedisTimeSeries менее выразителен, чем SQL. Он не поддерживает JOIN, подзапросы или сложные оконные функции.
- Ограниченная масштабируемость: хотя Redis Enterprise поддерживает кластеризацию, управление шардированием временных рядов может потребовать дополнительной настройки.
- Лицензионные ограничения: лицензия RSAL накладывает ограничения на коммерческое использование, особенно для облачных провайдеров, предлагающих Redis как услугу.
Источники
- Официальная документация Redis — раздел RedisTimeSeries.
- Redis Labs (Redis Ltd.) — технические блоги и документация по модулям.
- Статья «RedisTimeSeries: A Time Series Database for the Internet of Things» (Redis Labs, 2018).
- Документация по Redis Stack.
- Репозиторий RedisTimeSeries на GitHub.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →