我试图了解 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。这是预期的行为吗,因为它需要向后查看才能进行聚合?或者是否需要多个值才能进行聚合?
感谢您尝试 RedisTimeSeries。
让我们分解一下实际发生的情况,然后我会解释原因。
创建规则时,您需要指定 2 个参数:聚合类型和存储桶大小。
(这里需要注意的是,存储桶大小以毫秒为单位,而不是秒)
一旦有了规则,添加的每个样本都会用于计算当前聚合值,一旦存储桶上下文结束,我们就会将该值刷新到下采样的键。
我们如何知道一个桶上下文已经结束了?如果您有 5 秒的时间段,我们将保持上下文打开,直到我们获得超出 5 秒范围的样本。
那么为什么你只看到前一个存储桶呢?
原因有两个:
- 这是一种优化,以避免打开下采样密钥并写入样本(覆盖样本是 CPU 密集型操作,因为我们压缩了数据结构以将数据保留在内存中)
- API - 我们宁愿不返回部分存储桶,以避免显示“飞行中”数据。
我希望这能回答您的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)