Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php redis timeseries数据和时区_Php_Redis_Key Value_Nosql - Fatal编程技术网

Php redis timeseries数据和时区

Php redis timeseries数据和时区,php,redis,key-value,nosql,Php,Redis,Key Value,Nosql,我正在尝试使用redis(和php)实现一个timeseries db来存储简单计数器,但我认为这种语言不应该相关。因此,我实现了如下redis键(简化): someprefix:YYYY-MM-DD:somecounter 现在,当我想要获得特定间隔的数据范围时,我只需要获得特定范围的所有键,这一切都很好。(YYYY-MM-DD是UTC的日期) 现在我想实现根据某个时区X获取数据的功能。 我的问题是:有没有任何方法可以用这个关键模式来达到任何程度的准确性 我猜不会,因为根本没有时间信息,所以我

我正在尝试使用redis(和php)实现一个timeseries db来存储简单计数器,但我认为这种语言不应该相关。因此,我实现了如下redis键(简化):

someprefix:YYYY-MM-DD:somecounter

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

现在我想实现根据某个时区X获取数据的功能。 我的问题是:有没有任何方法可以用这个关键模式来达到任何程度的准确性

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

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

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


谢谢

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

我建议用时间戳来框键。例如,在时间戳140980502515(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
例如,要计算每小时的页面浏览量,请找到适当的每小时bucket并递增计数器

mypage.html:1409800464000:page_views INCR 10

首先,我不确定您是如何做到“获取特定范围的所有关键点,这些都可以正常工作”的,但如果您使用的是keys someprefix:*请注意,这不是推荐的生产实践。考虑使用V2.8中可用的扫描命令。

第二,你可以考虑使用有序集合进行计数。因此,按照惯例,您将有一个名为
someprefix:somecounter
的键,您将向成员添加该键,并将历元作为其分数。使用历元和计数器读数作为唯一的成员名称(例如“140980500000:1”,其中140980500000是历元,1是计数器值)


注意,你可以测量从几年到微秒的时间分辨率——这完全取决于在设置分数之前你对原始时期应用了多少div.< /P>感谢约翰的回答,但是作为一个例子,考虑下面的场景:一个在不同时区的客户端(如UTC + 1),请求提供2014-09-02至2014-09-06的数据。我的系统将转换客户提供给UTC的日期,因此在转换后,我有2014-09-01 23:00:00到2014-09-05 23:00:00,我将获得第一天的所有数据,而实际上,从那天起我只需要1小时。所以我的问题是:在这种情况下,每天创建一个时间段真的有用吗?即使我每小时只有一个桶,也有15和30米偏移的时区。你好,伊塔玛。现在,正如我在最初的帖子中所说的,我正在用不同的键保存不同的日子。不,不使用keys命令。我只是在请求的时间间隔内循环所有键,因此如果客户机请求2014-09-01到2014-09-05的数据,我只需使用循环代码获取这些日期的所有键,并创建一个类似于“day=>counter”的数组,该数组反过来用于填充图形。重要的问题是如何在redis中存储日期,以便我可以快速对其执行时区转换,并在客户端的tz中返回相关范围。