Почему Redis TimeSeries не захватывает последний элемент в агрегации? - PullRequest
2 голосов
/ 20 июня 2020

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

Я создал образец кода в redis-cli, чтобы проиллюстрировать:

127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> TS.CREATE source
OK
127.0.0.1:6379> TS.CREATE sumRule
OK
127.0.0.1:6379> TS.CREATERULE source sumRule AGGREGATION sum 1
OK
127.0.0.1:6379> TS.ADD source * 1
(integer) 1592638841406
127.0.0.1:6379> TS.ADD source * 2
(integer) 1592638843446
127.0.0.1:6379> TS.ADD source * 3
(integer) 1592638846536
127.0.0.1:6379> TS.ADD source * 4
(integer) 1592638849085
127.0.0.1:6379> TS.GET sumRule
1) (integer) 1592638846536
2) 3

Я ожидал, что здесь последним элементом будет 4, а не 3. Это ожидаемое поведение, потому что оно должно выглядеть назад, чтобы сделать агрегаты? Или для агрегации требуется более одного значения?

1 Ответ

3 голосов
/ 21 июня 2020

Спасибо за попытку RedisTimeSeries.

Давайте разберемся, что происходит на самом деле, а затем я объясню почему. При создании правила необходимо указать 2 параметра: тип агрегации и размер сегмента. (здесь важно отметить, что размер сегмента указывается в миллисекундах, а не в секундах)

Если у вас есть правило, каждая добавляемая выборка используется для вычисления текущего агрегированного значения после завершения контекста корзины мы передаем sh значение ключу с пониженной дискретизацией. Как мы узнаем, что контекст корзины закончился? если у вас есть сегмент в 5 секунд, мы будем держать контекст открытым до тех пор, пока не получим образец, выходящий за пределы диапазона 5 секунд.

Так почему вы видите только предыдущий сегмент? Для этого есть 2 причины:

  1. Это оптимизация, позволяющая избежать открытия ключа с субдискретизацией и записи выборки (переопределение выборки - это операция с интенсивным использованием процессора, поскольку мы сжали структуру данных для хранения данных в память)
  2. API - мы предпочли не возвращать частичную корзину, чтобы не отображать данные «в полете».

Надеюсь, это ответит на ваши вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...