TS.MREVRANGE
TS.MREVRANGE
TS.MREVRANGE 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.4.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.MREVRANGE также сообщает о сжатом значении последнего, возможно, частичного, бакета, при условии, что начальное время этого бакета попадает в [fromTimestamp, toTimestamp]. Без LATEST, TS.MREVRANGE не сообщает о последнем, возможно, частичном, бакете. Когда временной ряд не является сжатием, 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")
-
MREVRANGE не может быть частью транзакции при работе с кластером Redis.
Значение результата
Если GROUPBY label REDUCE reducer не указан:
-
Массивный ответ: для каждого временного ряда, соответствующего заданным фильтрам, сообщается следующее:
- строка-ответ: имя ключа временного ряда
-
Массивный ответ: пары имя-значение метки (строка-ответ, строка-ответ)
- По умолчанию сообщается пустой список
- Если
WITHLABELSуказан, сообщаются все метки, связанные с этим временным рядом - Если
SELECTED_LABELS label...указан, сообщаются выбранные метки
- Массивный ответ: пары временная метка-значение (целое число, простая строка (двойное)): все выборки/агрегации, соответствующие диапазону
Если GROUPBY label REDUCE reducer указан:
-
Массивный ответ: для каждой группы временных рядов, соответствующих заданным фильтрам, сообщается следующее:
- строка-ответ с форматом
label=value, гдеlabel— аргумент меткиGROUPBY -
Массивный ответ: единственная пара (строка-ответ, строка-ответ): аргумент метки
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.MREVRANGE - + 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) 1020
2) 120
2) 1) (integer) 1010
2) 110
3) 1) (integer) 1000
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.MREVRANGE - + 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) 3000
2) 310
2) 1) (integer) 2000
2) 210
3) 1) (integer) 1000
2) 110Группировка результатов запроса
Запросите все временные ряды с меткой метрики, равной 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.MREVRANGE - + 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) 1548149185000
2) 45
2) 1) (integer) 1548149180000
2) 90
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.MREVRANGE - + 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.MREVRANGE - + SELECTED_LABELS team FILTER metric=cpu
1) 1) "ts1"
2) 1) 1) "team"
2) (nil)
3) 1) 1) (integer) 1548149185000
2) 45
2) 1) (integer) 1548149180000
2) 90
2) 1) "ts2"
2) 1) 1) "team"
2) (nil)
3) 1) 1) (integer) 1548149180000
2) 99См. также
TS.MRANGE | TS.RANGE | TS.REVRANGE
Связанные темы
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/ts.mrevrange/