TS.MRANGE
TS.MRANGE
TS.MRANGE fromTimestamp toTimestamp [LATEST] [FILTER_BY_TS ts...] [FILTER_BY_VALUE min max] [WITHLABELS | SELECTED_LABELS label...] [COUNT count] [[ALIGN align] AGGREGATION aggregator bucketDuration [BUCKETTIMESTAMP bt] [EMPTY]] FILTER filterExpr... [GROUPBY label REDUCE reducer]
- Доступно в:
- Redis Stack / TimeSeries 1.0.0
- Временная сложность:
- O(n/m+k), где n = Количество данных, m = Размер фрагмента (количество данных в фрагменте), k = Количество данных в запрошенных диапазонах
Запрос диапазона по нескольким временным рядам с фильтрами в прямом направлении
Обязательные аргументы
fromTimestamp
это начальная метка времени для запроса диапазона (целое число UNIX-метка времени в миллисекундах) или - для обозначения метки времени самого раннего образца среди всех временных рядов, проходящих FILTER filterExpr....
toTimestamp
это конечная метка времени для запроса диапазона (целое число UNIX-метка времени в миллисекундах) или + для обозначения метки времени самого позднего образца среди всех временных рядов, проходящих FILTER filterExpr....
FILTER filterExpr...
фильтрует временные ряды на основе их меток и значений меток. Каждое выражение фильтра имеет один из следующих синтаксисов:
-
label=value, гдеlabelравноvalue -
label!=value, гдеlabelне равноvalue -
label=, где уkeyнет меткиlabel -
label!=, где уkeyесть меткаlabel -
label=(value1,value2,...), где уkeyс меткойlabelравно одному из значений в списке -
label!=(value1,value2,...), где ключ с меткойlabelне равен ни одному из значений в списке
- Требуется по крайней мере один
label=valueфильтр. - Фильтры являются конъюнктивными. Например, фильтр
type=temperature room=studyозначает, что временной ряд — это временной ряд температуры из учебной аудитории. - Не используйте пробелы в выражении фильтра.
Необязательные аргументы
LATEST (с RedisTimeSeries v1.8)
используется, когда временной ряд является сжатым. С помощью LATEST, TS.MRANGE также сообщает сжатое значение последнего, возможно, частичного бакета, при условии, что начало этого бакета попадает в [fromTimestamp, toTimestamp]. Без LATEST, TS.MRANGE не сообщает о последнем, возможно, частичном бакете. Если временной ряд не является сжатым, LATEST игнорируется.
Данные в последнем бакете сжатия могут быть частичными. Бакет закрывается и сжимается только при поступлении нового образца, который открывает новый последний бакет. Однако есть случаи, когда требуется сжатое значение последнего, возможно, частичного бакета. В таком случае используйте LATEST.
FILTER_BY_TS ts... (с RedisTimeSeries v1.6)
фильтрует образцы по списку определенных меток времени. Образец проходит фильтр, если его точная метка времени указана и попадает в [fromTimestamp, toTimestamp].
FILTER_BY_VALUE min max (с RedisTimeSeries v1.6)
фильтрует образцы по минимальным и максимальным значениям.
WITHLABELS
включает в ответ все пары имя-значение, представляющие метки метаданных временных рядов. Если WITHLABELS или SELECTED_LABELS не указаны, по умолчанию сообщается пустой список пар имя-значение.
SELECTED_LABELS label... (с RedisTimeSeries v1.6)
возвращает подмножество пар имя-значение, которые представляют метки метаданных временного ряда. Используйте, когда существует большое количество меток на серию, но требуются только значения некоторых из меток. Если WITHLABELS или SELECTED_LABELS не указаны, по умолчанию сообщается пустой список пар имя-значение.
COUNT count
ограничивает количество возвращаемых образцов.
ALIGN align (с RedisTimeSeries v1.6)
является элементом управления выравниванием временных бакетов для AGGREGATION. Он управляет метками времени бакетов, изменяя базовую метку времени, по которой определяется бакет.
Значения включают:
-
startили-: Базовая метка времени будет временем начала запрошенного интервала (fromTimestamp), которое не может быть- -
endили+: Базовая метка времени будет временем окончания запрошенного интервала (toTimestamp), которое не может быть+ - Конкретная метка времени: выравнивание базовой метки времени до определенного времени
0.
AGGREGATION aggregator bucketDuration
по временным рядам агрегирует образцы во временные бакеты, где:
-
aggregatorпринимает один из следующих типов агрегирования:aggregatorОписание avgСреднее арифметическое всех значений sumСумма всех значений minМинимальное значение maxМаксимальное значение rangeРазница между максимальным и минимальным значениями countКоличество значений firstЗначение с наименьшей меткой времени в бакете lastЗначение с наибольшей меткой времени в бакете std.pСреднеквадратическое отклонение генеральной совокупности значений std.sСреднеквадратическое отклонение выборочных значений var.pДисперсия генеральной совокупности значений var.sДисперсия выборочных значений twaСредневзвешенное значение по временной шкале бакета (с RedisTimeSeries v1.8) -
bucketDuration— продолжительность каждого бакета в миллисекундах.
Без ALIGN, метки начала бакетов являются кратными bucketDuration.
С ALIGN align, метки начала бакетов кратны bucketDuration с остатком align % bucketDuration.
Первая метка начала бакета меньше или равна fromTimestamp.
[BUCKETTIMESTAMP bt] (с RedisTimeSeries v1.8)
управляет тем, как сообщаются метки времени бакетов.
bt | Метка времени, сообщенная для каждого бакета |
|---|---|
- или low
| начало бакета (по умолчанию) |
+ или high
| конец бакета |
~ или mid
| середина бакета (округлена вниз, если не целое число) |
[EMPTY] (с RedisTimeSeries v1.8)
это флаг, который, если указан, сообщает агрегации также для пустых бакетов.
aggregator | Значение, сообщенное для каждого пустого бакета |
|---|---|
sum, count
| 0 |
last | Значение последнего образца перед началом бакета. NaN при отсутствии такого образца. |
twa | Среднее значение по временной шкале бакета на основе линейной интерполяции последнего образца перед началом бакета и первого образца после окончания бакета. NaN при отсутствии таких образцов. |
min, max, range, avg, first, std.p, std.s
| NaN |
Независимо от значений fromTimestamp и toTimestamp, данные не сообщаются для бакетов, которые заканчиваются до самого раннего образца или начинаются после самого позднего образца во временном ряду.
GROUPBY label REDUCE reducer (с RedisTimeSeries v1.6)
разделяет временные ряды на группы, каждая группа содержит временные ряды, которые имеют одинаковое значение для указанного имени метки, затем агрегирует результаты в каждой группе.
В сочетании с AGGREGATION применяется GROUPBY/REDUCE на этапе после агрегации.
-
label— это имя метки. Группа создается для всех временных рядов, которые имеют одинаковое значение для этой метки. -
reducer— это тип агрегации, используемый для агрегирования результатов в каждой группе.reducerОписание avgСреднее арифметическое всех значений, не равных NaN (с RedisTimeSeries v1.8) sumСумма всех значений, не равных NaN minМинимальное значение, не равное NaN maxМаксимальное значение, не равное NaN rangeРазница между максимальным и минимальным значениями, не равными NaN (с RedisTimeSeries v1.8) countКоличество значений, не равных NaN (с RedisTimeSeries v1.8) std.pСреднеквадратическое отклонение генеральной совокупности всех значений, не равных NaN (с RedisTimeSeries v1.8) std.sСреднеквадратическое отклонение выборочной совокупности всех значений, не равных NaN (с RedisTimeSeries v1.8) var.pДисперсия генеральной совокупности всех значений, не равных NaN (с RedisTimeSeries v1.8) var.sДисперсия выборочной совокупности всех значений, не равных NaN (с RedisTimeSeries v1.8)
- Полученный временной ряд называется
<label>=<value> - Полученный временной ряд содержит две метки со следующей структурой массива меток:
-
__reducer__, используемый редуктор (например,"count") -
__source__, список ключей временных рядов, используемых для вычисления сгруппированного ряда (например,"key1,key2,key3")
-
MRANGE не может быть частью транзакции при выполнении в кластере Redis.
Возвращаемое значение
Если GROUPBY label REDUCE reducer не указано:
-
Массив ответов: для каждого временного ряда, соответствующего указанным фильтрам, сообщается следующее:
- строка-ответ: имя ключа временного ряда
-
Массив ответов: пары метка-значение (строковый ответ, строковый ответ)
- По умолчанию сообщается пустой массив
- Если
WITHLABELSуказано, сообщаются все метки, связанные с этим временным рядом - Если
SELECTED_LABELS label...указано, сообщаются выбранные метки (значение null, если такая метка не определена)
- Массив ответов: пары временная метка-значение (целое число ответа, простой строковый ответ (двойное)): все примеры/агрегации, соответствующие диапазону
Если GROUPBY label REDUCE reducer указано:
-
Массив ответов: для каждой группы временных рядов, соответствующих указанным фильтрам, сообщается следующее:
- строка-ответ с форматом
label=valueгдеlabel— аргумент меткиGROUPBY -
Массив ответов: пары метка-значение (строковый ответ, строковый ответ):
- По умолчанию сообщается пустой массив
- Если
WITHLABELSуказано, сообщаются аргумент меткиGROUPBYи его значение - Если
SELECTED_LABELS label...указано, сообщаются выбранные метки (значение null, если такая метка не определена или метка не имеет одинакового значения для всех сгруппированных временных рядов)
-
Массив ответов: либо одна пара (строковый ответ, строковый ответ): аргумент метки
GROUPBYи его значение, или пустой массив, если -
Массив ответов: одна пара (строковый ответ, строковый ответ): строка
__reducer__и аргумент редуктора -
Массив ответов: одна пара (строковый ответ, строковый ответ): строка
__source__и имена ключей временных рядов, разделенные, - Массив ответов: пары временная метка-значение (целое число ответа, простой строковый ответ (двойное)): все примеры/агрегации, соответствующие диапазону
- строка-ответ с форматом
Примеры
Получение максимальной цены акций на каждый момент времени
Создайте две акции и добавьте их цены в три разные момента времени.
127.0.0.1:6379> TS.CREATE stock:A LABELS type stock name A
OK
127.0.0.1:6379> TS.CREATE stock:B LABELS type stock name B
OK
127.0.0.1:6379> TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020
127.0.0.1:6379> TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020Теперь вы можете получить максимальную цену акций для каждого момента времени.
127.0.0.1:6379> TS.MRANGE - + WITHLABELS FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock"
2) 1) 1) "type"
2) "stock"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "stock:A,stock:B"
3) 1) 1) (integer) 1000
2) 120
2) 1) (integer) 1010
2) 110
3) 1) (integer) 1020
2) 120Оператор FILTER type=stock возвращает один временной ряд, представляющий цены акций. Оператор GROUPBY type REDUCE max разделяет временные ряды на группы с одинаковыми типами значений и затем для каждого момента времени агрегирует все ряды, которые имеют одинаковое значение типа, используя агрегатор max.
Расчет средней цены акций и получение максимального среднего значения
Создайте две акции и добавьте их цены в девять разных моментов времени.
127.0.0.1:6379> TS.CREATE stock:A LABELS type stock name A
OK
127.0.0.1:6379> TS.CREATE stock:B LABELS type stock name B
OK
127.0.0.1:6379> TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020
127.0.0.1:6379> TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
1) (integer) 1000
2) (integer) 1010
3) (integer) 1020
127.0.0.1:6379> TS.MADD stock:A 2000 200 stock:A 2010 210 stock:A 2020 220
1) (integer) 2000
2) (integer) 2010
3) (integer) 2020
127.0.0.1:6379> TS.MADD stock:B 2000 220 stock:B 2010 210 stock:B 2020 200
1) (integer) 2000
2) (integer) 2010
3) (integer) 2020
127.0.0.1:6379> TS.MADD stock:A 3000 300 stock:A 3010 310 stock:A 3020 320
1) (integer) 3000
2) (integer) 3010
3) (integer) 3020
127.0.0.1:6379> TS.MADD stock:B 3000 320 stock:B 3010 310 stock:B 3020 300
1) (integer) 3000
2) (integer) 3010
3) (integer) 3020Теперь для каждой акции рассчитайте среднюю цену акций за 1000-миллисекундный период, а затем получите акцию с максимальным средним значением за этот период.
127.0.0.1:6379> TS.MRANGE - + WITHLABELS AGGREGATION avg 1000 FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock"
2) 1) 1) "type"
2) "stock"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "stock:A,stock:B"
3) 1) 1) (integer) 1000
2) 110
2) 1) (integer) 2000
2) 210
3) 1) (integer) 3000
2) 310Группировка результатов запроса
Запросите все временные ряды с меткой метрики, равной cpu, затем сгруппируйте временные ряды по значению метки metric_name и для каждой группы верните максимальное значение и ключи временных рядов (источник) с этим значением.
127.0.0.1:6379> TS.ADD ts1 1548149180000 90 labels metric cpu metric_name system
(integer) 1548149180000
127.0.0.1:6379> TS.ADD ts1 1548149185000 45
(integer) 1548149185000
127.0.0.1:6379> TS.ADD ts2 1548149180000 99 labels metric cpu metric_name user
(integer) 1548149180000
127.0.0.1:6379> TS.MRANGE - + WITHLABELS FILTER metric=cpu GROUPBY metric_name REDUCE max
1) 1) "metric_name=system"
2) 1) 1) "metric_name"
2) "system"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "ts1"
3) 1) 1) (integer) 1548149180000
2) 90
2) 1) (integer) 1548149185000
2) 45
2) 1) "metric_name=user"
2) 1) 1) "metric_name"
2) "user"
2) 1) "__reducer__"
2) "max"
3) 1) "__source__"
2) "ts2"
3) 1) 1) (integer) 1548149180000
2) 99Фильтрация результатов запроса по значению
Запросите все временные ряды с меткой метрики, равной cpu, затем отфильтруйте значения, большие или равные 90.0 и меньшие или равные 100.0.
127.0.0.1:6379> TS.ADD ts1 1548149180000 90 labels metric cpu metric_name system
(integer) 1548149180000
127.0.0.1:6379> TS.ADD ts1 1548149185000 45
(integer) 1548149185000
127.0.0.1:6379> TS.ADD ts2 1548149180000 99 labels metric cpu metric_name user
(integer) 1548149180000
127.0.0.1:6379> TS.MRANGE - + FILTER_BY_VALUE 90 100 WITHLABELS FILTER metric=cpu
1) 1) "ts1"
2) 1) 1) "metric"
2) "cpu"
2) 1) "metric_name"
2) "system"
3) 1) 1) (integer) 1548149180000
2) 90
2) 1) "ts2"
2) 1) 1) "metric"
2) "cpu"
2) 1) "metric_name"
2) "user"
3) 1) 1) (integer) 1548149180000
2) 99Запрос с использованием метки
Запросите все временные ряды с меткой метрики, равной cpu, но верните только метку команды.
127.0.0.1:6379> TS.ADD ts1 1548149180000 90 labels metric cpu metric_name system team NY
(integer) 1548149180000
127.0.0.1:6379> TS.ADD ts1 1548149185000 45
(integer) 1548149185000
127.0.0.1:6379> TS.ADD ts2 1548149180000 99 labels metric cpu metric_name user team SF
(integer) 1548149180000
127.0.0.1:6379> TS.MRANGE - + SELECTED_LABELS team FILTER metric=cpu
1) 1) "ts1"
2) 1) 1) "team"
2) "NY"
3) 1) 1) (integer) 1548149180000
2) 90
2) 1) (integer) 1548149185000
2) 45
2) 1) "ts2"
2) 1) 1) "team"
2) "SF"
3) 1) 1) (integer) 1548149180000
2) 99См. также
TS.RANGE | TS.MREVRANGE | TS.REVRANGE
Связанные темы
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/ts.mrange/