2014-09-03 231 views
1

我想實現一個時間序列數據庫來存儲簡單的計數器使用redis(和PHP,但語言不應該是相關的,我認爲)。所以,我實現了我的Redis鍵如下(簡化):redis時間序列數據和時區

someprefix:YYYY-MM-DD:somecounter

現在,當我想要得到的數據範圍爲特定的時間間隔,我只是得到所有鑰匙對於特定的範圍,這一切都工作正常。 (YYYY-MM-DD是UTC的日期)

現在我想實現根據某個時區X獲取數據的能力。 我的問題是:有什麼方法可以使用此關鍵模式任何程度的準確性?

我猜測沒有,因爲根本沒有時間信息,所以我也必須添加至少小時和分鐘的關鍵所以時區轉換工作正常。我也可能應該在較小的時間間隔內保存信息,否則在轉換時區時有時候我會在不同日期獲得所有數據,因爲時區差異不應該超過13小時,因此給我錯誤的結果,我是對的?

在redis鍵上使用unix時間戳而不是格式化日期會更合適嗎?例如,如果我稍後決定以更小的精度存儲數據,比如說每小時或每10分鐘一次,那麼什麼是更靈活的密鑰格式?

希望我能夠正確解釋我的問題,但請隨時要求澄清。

感謝

回答

1

它總是好去與時代(UNIX時間戳),當你要處理的時區。

我會建議屏蔽時間戳來構造密鑰。例如事件發生在時間戳1409800502515(星期四,2014年9月4日3時15分02秒格林尼治標準時間),你可以在樣

someprefix:1409800500000:somecounter OR 
someprefix:1409800464000:somecounter 
小時級別或級別日這樣

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

和框架鍵鬥它

例如計算每小時頁面瀏覽,找到合適的每小時桶和增加計數器

mypage.html:1409800464000:page_views INCR 10 
+0

感謝您的答案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偏移的時區。 – dev 2014-09-04 17:48:29

0

首先,我不知道你是如何做的「讓所有鍵的具體響e,這一切都工作正常「,但如果您使用KEYS someprefix:*請注意,這不是建議的生產實踐。考慮使用v2.8中提供的SCAN命令。其次,你可以考慮使用一個有序集進行計數。所以,按照你的慣例,你將會得到一個叫做someprefix:somecounter的關鍵字,你將會以這個紀元的成員作爲他們的得分。使用epoch和計數器的讀數作爲唯一的成員名稱(例如'1409800500000:1`,其中1409800500000是時期,1是計數器的值)。

請注意,您可以測量從幾年到幾微秒的時間分辨率 - 這一切都取決於您在設置分數之前應用了多少div到原始時期。

+0

你好Itamar。現在,我正在不同的鍵上保存不同的日子,正如我在初始帖子中所說的那樣。不,不使用keys命令。我只是在請求的時間間隔內遍歷所有密鑰,所以如果客戶端請求2014-09-01到2014-09-05的數據,我只需要在代碼中使用循環來獲取這些日期的所有密鑰並創建一個數組看起來像「day => counter」,它反過來被用來填充圖形。重要的問題是如何將日期存儲在redis中,以便我可以快速執行時區轉換並在客戶端的tz中返回相關範圍。 – dev 2014-09-08 16:55:08