2012-11-01 159 views
8

我正在考慮將Redis用於Web應用程序日誌記錄目的。我搜索了一下,有人使用這種方法將日誌轉儲到Redis隊列/列表中,然後將計劃工作人員寫入磁盤。redis用於日誌記錄

http://nosql.mypopescu.com/post/8652869828/another-redis-use-case-centralized-logging

我希望尋求理解是,爲什麼不直接使用Redis的堅持到磁盤?如果我已經分配了Redis將要寫入的小型服務器,與數據庫應用程序服務器分開,使用Redis直接保存日誌是否可行?

我還需要幫助通過datetime,user等查詢Redis。例如,每個日誌如下。

datetime=>2012-03-24 17:45:12 
userid=>123 
message=>test message 
category=>my category 

我怎樣才能查詢結果的日期時間範圍內,由特定用戶,特定類別的?

謝謝!

回答

19

您需要記住Redis是內存數據庫(即使它可以將數據保留到磁盤)。您放入Redis中的數據必須適合內存。

您提到的文章中的建議是關於將Redis用作分佈式排隊系統。工作進程將這些項目出隊並將其寫入磁盤,因此Redis內存中沒有那麼多項目。這種設計有一個缺陷:如果工作進程不能將數據寫入磁盤的速度足夠快,Redis的內存消耗就會爆炸 - 所以它必須受到配置(Redis maxmemory參數)或軟件的限制(在插入​​時修剪隊列或空隊列滿時)。

由於您在Redis中編寫的所有數據都將保存在內存中(即使它們由Redis本身持久保存到磁盤),現在您的提議並不奏效。

另一點是你無法查詢Redis。 Redis不是關係數據庫,它不支持臨時查詢機制,只支持涉及以前定義的訪問路徑的命令。如果要搜索具有不同參數的數據,則必須預計所有可能的搜索,並在插入時建立相關數據結構(集合,排序集合等)。

另一個商店(MongoDB或關係數據庫)可能會更適合您的用例。

+0

我只是看着一個Redis的演示。 Peter Cooper說Redis是爲伐木設計/實施的(他足夠接近權威來源)。因此,儘管您的評論足夠真實,但還需要額外閱讀。 – Richard

+3

Redis旨在支持lloogg(http://lloogg.com/)。但lloogg服務並不是將所有內容都放在內存中,然後處理查詢。它是在正確的數據結構內即時存儲/聚合數據,以便輕鬆訪問數據。這不是一回事。 –

1

Redis在內存數據存儲中。使用Save或BGSAVE命令可以將數據直接保存到磁盤。持久性(RDB/AOF)除了在內存中存儲之外,還是一項功能。

要求提到的是將日誌存儲到磁盤。使用任何消息隊列(如RabbitMQ)而不是內存數據存儲區應該使事情變得簡單。 (日誌不會吃掉內存)

生成日誌的應用程序可以將它們發佈到隊列中,並讓單獨的使用者使用日誌消息並將它們寫入磁盤。

如何查詢日期時間範圍內由特定用戶指定的特定類別的結果?

日誌中的每塊應該被存爲一個結構(例如用於C/C++)是這樣的:

struct log{ 
    long datatime; 
    string userId; 
    string message; 
    string category; 
    }; 

序列化此結構,以字符串,並將其在Redis的存儲爲值。 鍵這些值會像: 鍵=用戶id + DELIMITER +類別+ DELIMITER + DATATIME

你可以有函數,得到所有的鑰匙回來,分裂他們得到的數據列表爲您的特定關鍵字。

+0

是否可以使用這種方法發佈範圍查詢(在datetime上)? – Legend

7

您可以將日誌與結構如下:

"logs:{category}:{userid}:{datetime}" = message 

,然後要求它如下:

"logs:*:{userid}:{datetime}" 

或者

"logs:{category}:*:{datetime}"