2016-04-27 19 views
0

我有一個條件,我需要計算來自我的HTTP服務器的請求數,按小時和請求類型聚合。 例如 - 這是我想獲得的那種輸出數據的,如果我有3個獨特的資源請求如何在一天中存儲服務器上的請求數量?

Resource /a - 10 req between 10pm - 11pm, 13 req between 11pm - 12am 
Resource /b - 14 req between 10pm - 11pm, 17 req between 11pm - 12am 
Resource /c - 12 req between 10pm - 110m, 16 req between 11pm - 12am 

沒有爲實時報告沒有要求。它可以延遲幾個小時。我知道我可以通過日誌解析來實現這一點。但只是想知道是否有更好的方式來存儲這種數據。讓我們說Redis中的一個實時計數器,其中的密鑰是使用url + hour製作的,並且定期轉儲它可以讓每2個小時對其他數據庫進行轉儲。

回答

1

日誌解析或像Google Analytics(託管)或Piwik(自託管)這樣的分析系統是您的最佳選擇。不要試圖跟蹤代碼中的視圖,因爲如果你在前面添加一個完整頁面的緩存,你的代碼將不會每次都運行來跟蹤命中。

+0

不考慮頁面。考慮一個HTTP API請求。那麼這不排除Analytics或Piwik?是的,請求可以緩存在單獨的圖層上。在這種情況下,服務器上不會出現任何內容。這需要一個完全不同的機制來計算這些緩存的請求 –

1

一個將其存儲在Redis的方法是使用哈希: -

散列鍵如日期,時間樣本

hashkey: - 「2016-04-27-10-11」

"2016-04-27-10-11" :{ 

    "md5-request-uri-1" : "count of request", 
    "md5-request-uri-2" : "count of request" 

} 

,您可以使用Redis的功能是: - 由(HINCRBY)哈希增量

HINCRBY 2016-04-27-10-11 md5-request-uri-1 1 

http://redis.io/commands/HINCRBY

現在你可以有一個每小時cron來解析過去一小時的日誌,並將它們以上述格式存儲在redis中。

要獲得所有計數的資源,你可以使用: - HGETALL 爲了得到一個特定的資源,你可以使用的計數: - 我假設你有你的應用程序的Servlet HGET

http://redis.io/commands/hget

0

,在高級別過濾器中應用這樣的邏輯

hincrby(date + action,hour,1);

date -> current date 
hour -> current hour 
action -> the action you want to save 

,如果你想對整個約會行動的次數,做到hgetall日期+行動的具體小時框架,你可以在應用程序的邏輯地圖選擇獨自一人。做總和,那就是你的結果。

以這種方式,每個請求只會發生一個命中。 Redis需要1ms。我們一直以這種方式使用Redis進行實時分析。

0

我是Redis粉絲,但我不會使用Redis來做這樣的事情。我會使用Message Queue,比如RabbitMQ,或者更好的Kafka。只需將請求轉儲到那裏,然後有一個不同的進程從中選擇並處理它。

沒有理由爲計算計數器或做任何需要響應的請求添加延遲(即使是1ms)。

相關問題