func Red() {
keyname := "t"
var client = rt.NewClient("127.0.0.1:6379", "nohelp", nil)
client.CreateKeyWithOptions(keyname, rt.DefaultCreateOptions)
client.CreateKeyWithOptions("td", rt.DefaultCreateOptions)
client.CreateRule(keyname, rt.MaxAggregation, 5000, "td")
for i := 0; i < 10; i++ {
timestamp := time.Now()
fmt.Println(time.Now().Unix(), timestamp.String())
value := float64(i)
client.Add(keyname, timestamp.Unix(), value)
time.Sleep(time.Second)
}
fmt.Println(client.RangeWithOptions(keyname, rt.TimeRangeMinimum, rt.TimeRangeMaximum, rt.DefaultRangeOptions))
fmt.Println(client.RangeWithOptions("td", rt.TimeRangeMinimum, rt.TimeRangeMaximum, rt.DefaultRangeOptions))
}
这个小golang代码是我为了理解redis时间序列采样/压缩而写的。我尝试了很多源代码,但我还是不明白为什么我的输出目标序列是空的
O/P:
[{1677776687 0} {1677776688 1} {1677776689 2} {1677776690 3} {1677776691 4} {1677776692 5} {1677776693 6} {1677776694 7} {1677776695 8} {1677776696 9}] <nil>
[] <nil>
我期望值4和9作为输出。我尝试了保留期,但仍然相同。
现在我尝试使用自动时间戳client.AddAutoTs(keyname, value)
在这种情况下,我得到随机结果,例如2和7,或者有时只有4,例如:
[{1677777452390 0} {1677777453407 1} {1677777454422 2} {1677777455436 3} {1677777456468 4} {1677777457477 5} {1677777458490 6} {1677777459505 7} {1677777460518 8} {1677777461569 9}] <nil>
[{1677777450000 2} {1677777455000 7}] <nil>
有人能在这里帮助了解什么和为什么会发生,我如何达到预期的结果?提前感谢
1条答案
按热度按时间7bsow1i61#
请注意,时间戳的单位为毫秒。
因此,
client.Add(keyname, timestamp.Unix(), value)
应替换为client.Add(keyname, timestamp.UnixMilli(), value)
。以下是更新后的演示:
我期望输出值为4和9。
它并不像你期望的那样工作。它取决于采样周期。
对于此输出:
采样周期为:
1677824975000
~1677824980000
:最大值为4
(来自1677824979167
)1677824980000
~1677824985000
:当我们从数据库中读取数据时,周期还没有结束,所以数据还没有生成。对于此输出:
采样周期为:
1677824995000
~1677825000000
:最大值为0
(来自1677824999116
)1677825000000
~1677825005000
:最大值为5
(来自1677825004123
)1677825005000
~1677825010000
:当我们从数据库中读取数据时,周期还没有结束,所以数据还没有生成。