redis时间序列数据和时区

时间:2014-09-03 23:56:00

标签: php redis key-value nosql

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

someprefix:YYYY-MM-DD:somecounter

现在,当我想获得特定间隔的一系列数据时,我只获得特定范围的所有密钥,这一切都正常。 (YYYY-MM-DD是UTC的日期)

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

我猜不是,因为根本没有时间信息,所以我还必须至少为关键字添加小时和分钟,以便时区转换正常工作。我也可能应该以较小的时间间隔保存信息,否则在转换时区时有些情况下,当时区差异不应超过13h时,我最终会获得不同日期的所有数据,因此给我错误的结果,我是对的?

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

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

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

首先,我不确定你是怎么做的,并且能够获得特定范围内的所有密钥,并且所有密钥都能正常工作"但如果您使用KEYS someprefix:*请注意,这不是推荐的制作练习。请考虑使用可从v2.8获得的SCAN命令。

其次,您可以考虑使用有序集进行计数。因此,根据您的约定,您将拥有一个名为someprefix:somecounter的密钥,您可以将其作为分数以ZochDing为成员。使用纪元和计数器的读数作为唯一的会员名称(例如,' 1409800500000:1`其中1409800500000是纪元,1是计数器的值)。

请注意,您可以测量从年到微秒的时间分辨率 - 这一切都取决于您在设置分数之前应用于原始纪元的div数。