2012-11-01 8 views
8

私は、Webアプリケーションのロギングの目的でRedisを使用することを考えています。私は、Redisキュー/リストにログをダンプしてから、ディスクに書き込む予定のワーカーを使ってこのアプローチを使用している人がいることを知りました。ロギングのためのredis

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

私はなぜ直接ディスクに永続化するためのRedisを使用しないという理解を求めたいですか?私がRedisがデータベース、アプリケーションサーバから分離して書いた小さなサーバを割り当てた場合、Redisを使って直接ログを永続化することは可能でしょうか?

また、Redisに日時、ユーザーなどを照会する際にも助けが必要です。たとえば、それぞれのログは次のとおりです。

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

特定のカテゴリの特定のユーザーが日付/時刻の範囲内で結果を照会するにはどうすればよいですか。

ありがとうございます!

答えて

19

Redisはインメモリデータベースであることに注意してください(データをディスクに保存できる場合でも)。 Redisに入れたデータは、メモリに収める必要があります。

あなたが言及した記事の提案は、Redisを分散型キューイングシステムとして使用することに関するものです。作業者プロセスはアイテムをデキューしてディスクに書き込むため、レディスのメモリにはそれほど多くのアイテムがありません。この設計には欠点があります:ワーカープロセスがデータをディスクに十分速く書き込めない場合、Redisのメモリ消費が爆発的になるため、設定(Redis maxmemoryパラメータ)またはソフトウェア(挿入時にキューをトリミングするか空キューがいっぱいになったとき)。

Redisで書いたすべてのデータは、Redis自体によってディスクに保存されていても、メモリに保持されるため、提案は実際には機能しません。

もう1つのポイントは、Redisに問い合わせることができないことです。 Redisはリレーショナルデータベースではなく、以前に定義されたアクセスパスを含むコマンドだけがアドホッククエリメカニズムをサポートしていません。異なるパラメータでデータを検索する場合は、挿入時にすべての可能な検索を予測し、関連するデータ構造(セット、ソート済みセットなど)を構築する必要があります。

他のストア(MongoDB、またはリレーショナルデータベース)は、おそらくあなたのユースケースに適しています。

+0

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

し、次のようにそれを要求します。ピーター・クーパー氏によると、レディス氏はロギングのために設計され、実装されていた(彼はソースに十分近づいて信頼できるものである)。したがって、あなたのコメントが十分に真実である間に、いくつかの追加の読書が必要です。 – Richard

+3

Redisはlloogg(http://lloogg.com/)をサポートするように設計されました。しかし、llooggサービスはすべてをメモリに保存してからクエリを処理することではありません。これは、適切なデータ構造内でオンザフライでデータを格納/集約し、データに簡単にアクセスできるようにすることです。これは同じことではありません。 –

1

Redisはメモリデータストアにあります。 SaveまたはBGSAVEコマンドを使用すると、ディスクへのデータの直接永続性が可能です。永続性(RDB/AOF)は、メモリ内の記憶域に加えて機能です。

ログをディスクに保存する必要があります。メモリ内のデータストアではなく、RabbitMQなどのメッセージキューを使用すると、単純なものになります。 (ログはメモリを消費しません)

ログを生成するアプリケーションは、ログメッセージを消費してディスクに書き込む別のコンシューマとキューにそれらを公開できます。

特定のカテゴリの特定のユーザーによる日時範囲内の結果を照会するにはどうすればよいですか。

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

は、文字列にこの構造体をシリアル化し、値としてのRedisに格納します。

ログのすべてのブロックは、構造(C/C++のための一例)として、このようなものを保存する必要があります。このような値のための キーは次のようになります: キー= userIdを+ DELIMITER +カテゴリ+ DELIMITER + datatime

あなたは戻ってすべてのキーを取得する機能を持っており、あなたの特定のキーワードのためのデータのリストを取得するためにそれらを分割することができます。

+0

このアプローチを使用して(datetimeで)範囲クエリを発行することは可能ですか? – Legend

7

あなたは次のような構造でログを保存することができます:私はちょうどRedisのデモを見

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

それとも

"logs:{category}:*:{datetime}" 
関連する問題