redis时间序列数据和时区



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

someprefix:YYYY-MM-DD:somecounter

现在,当我想获得特定间隔的数据范围时,我只需要获得特定范围的所有键,这一切都很好。(YYYY-MM-DD是UTC的日期)

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

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

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

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

感谢

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

我建议使用时间戳来构建关键帧。例如,事件发生在时间戳1409800502515(2014年9月4日星期四格林尼治标准时间03:15:02),您可以将其存储在小时级别或日级别,如以下

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

首先,我不确定你是如何"获取特定范围的所有键,这一切都很好"的,但如果你使用keys someprefix:*请注意,这不是推荐的生产实践。请考虑使用v2.8中提供的SCAN命令。

其次,您可以考虑使用有序集进行计数。因此,按照您的惯例,您将有一个名为someprefix:somecounter的密钥,您将以epoch作为其分数向成员ZADDing。使用epoch和计数器的读数作为唯一的成员名称(例如"1409800500000:1",其中1409800500000是epoch,1是计数器的值)。

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

最新更新