【问题标题】:redis timeseries data and timezonesredis时间序列数据和时区
【发布时间】:2014-10-28 14:31:12
【问题描述】:

我正在尝试使用redis(和php,但我认为该语言不应该相关)来实现一个时间序列数据库来存储简单的计数器。所以我实现了我的redis键如下(简化):

someprefix:YYYY-MM-DD:somecounter

现在,当我想获取特定间隔的数据范围时,我只需获取特定范围的所有键,一切正常。 (YYYY-MM-DD 是 UTC 的日期)

现在我想实现根据某个时区 X 获取数据的能力。 我的问题是:有没有什么方法可以以任何准确度使用这个关键模式?

我猜不是,因为根本没有时间信息,所以我还必须至少在键中添加小时和分钟,这样时区转换才能正常工作。我也可能应该以更小的时间间隔保存信息,否则在转换时区时,有时我会在不同的日子获得所有数据,而时区差异不应超过 13 小时,因此给我错误的结果,对吗? ?

只使用 unix 时间戳而不是 redis 键上的格式化日期会更合适吗?例如,如果我后来决定以较小的精度存储数据,比如每小时或每 10 分钟,那么更灵活的密钥格式是什么?

希望我能够正确解释我的问题,但请随时要求澄清。

谢谢

【问题讨论】:

    标签: php redis key-value nosql


    【解决方案1】:

    当您必须处理时区时,使用 epoch(UNIX 时间戳)总是好的。

    我建议使用时间戳来构建密钥。例如,一个事件发生在时间戳 1409800502515(星期四,2014 年 9 月 4 日 03:15:02 GMT),您可以像这样在小时级别或日级别存储它

    Hour bucket = 1409800502515 - (1409800502515 % (60 * 60)) = 1409800500000
    Day bucket  = 1409800502515 - (1409800502515 % (24 * 60 * 60)) = 1409800464000
    

    和框架键类似

    someprefix:1409800500000:somecounter OR
    someprefix:1409800464000:somecounter
    

    例如对于计算每小时的页面浏览量,找到合适的每小时桶并增加计数器

    mypage.html:1409800464000:page_views INCR 10
    

    【讨论】:

    • 感谢 John 的回答,但作为示例,请考虑以下场景:位于不同时区(例如 UTC +1)的客户端请求从 2014-09-02 到2014-09-06。我的系统会将客户提供的日期转换为 UTC,因此转换后我将 2014-09-01 23:00:00 转换为 2014-09-05 23:00:00,我最终将获得所有数据第 1 天,实际上我从那天起只需要 1 小时。所以我的问题是:在这种情况下,每天创建一个时间段真的有用吗?即使我只每小时存储一次,也有 15 和 30m 偏移的时区。
    【解决方案2】:

    首先,我不确定您是如何做到“获取特定范围的所有键并且一切正常”,但如果您使用 KEYS someprefix:* 请注意,这不是生产的推荐做法。考虑改用 v2.8 中提供的 SCAN 命令。

    其次,您可以考虑使用有序集进行计数。因此,按照您的约定,您将拥有一个名为someprefix:somecounter 的密钥,您将使用该纪元作为他们的分数来 ZADDing 给成员。使用纪元和计数器的读数作为唯一的成员名称(例如,“1409800500000:1”,其中 1409800500000 是纪元,1 是计数器的值)。

    请注意,您可以测量从几年到微秒的时间分辨率 - 这完全取决于您在设置分数之前对原始时期应用了多少 div。

    【讨论】:

    • 你好伊塔马尔。现在,正如我在最初的帖子中所说,我正在用不同的键保存不同的日子。不,不使用 keys 命令。我只是在请求的时间间隔内循环遍历所有键,所以如果客户端请求从 2014 年 9 月 1 日到 2014 年 9 月 5 日的数据,我只需在代码中使用循环来获取这些日期的所有键并创建一个看起来像“day => counter”的数组,它又用于填充图表。重要的问题是如何将日期存储在 redis 中,以便我可以快速对其进行时区转换并返回客户端 tz 中的相关范围。
    猜你喜欢
    • 2020-07-04
    • 2018-11-08
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2016-07-03
    • 2021-11-20
    • 2018-09-10
    相关资源
    最近更新 更多