Redis时间序列golang抽样

wgeznvg7  于 2023-03-06  发布在  Go
关注(0)|答案(1)|浏览(116)
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>

有人能在这里帮助了解什么和为什么会发生,我如何达到预期的结果?提前感谢

7bsow1i6

7bsow1i61#

请注意,时间戳的单位为毫秒
因此,client.Add(keyname, timestamp.Unix(), value)应替换为client.Add(keyname, timestamp.UnixMilli(), value)
以下是更新后的演示:

package main

import (
    "fmt"
    "time"

    rt "github.com/RedisTimeSeries/redistimeseries-go"
)

func main() {
    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().UnixMilli(), timestamp.String())
        value := float64(i)
        client.Add(keyname, timestamp.UnixMilli(), 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))
}

我期望输出值为4和9。
它并不像你期望的那样工作。它取决于采样周期。
对于此输出:

[{1677824975163 0} {1677824976163 1} {1677824977164 2} {1677824978166 3} {1677824979167 4} {1677824980169 5} {1677824981170 6} {1677824982173 7} {1677824983174 8} {1677824984176 9}] <nil>
[{1677824975000 4}] <nil>

采样周期为:

  • 1677824975000~1677824980000:最大值为4(来自1677824979167
  • 1677824980000~1677824985000:当我们从数据库中读取数据时,周期还没有结束,所以数据还没有生成。

对于此输出:

[{1677824999116 0} {1677825000117 1} {1677825001119 2} {1677825002121 3} {1677825003121 4} {1677825004123 5} {1677825005125 6} {1677825006126 7} {1677825007128 8} {1677825008129 9}] <nil>
[{1677824995000 0} {1677825000000 5}] <nil>

采样周期为:

  • 1677824995000~1677825000000:最大值为0(来自1677824999116
  • 1677825000000~1677825005000:最大值为5(来自1677825004123
  • 1677825005000~1677825010000:当我们从数据库中读取数据时,周期还没有结束,所以数据还没有生成。

相关问题