2013-06-17 6 views
8

私はデータストリームに対して何らかの分析を行い、その結果をRedisチャネルに公開しています。消費者はこれらのチャンネルを購読し、リアルタイムのデータフィードを取得します。履歴データ解析の結果はすべて失われます。時間ベースの値をソートするためのRedisデータ構造の設計

ここでは、消費者がこの履歴データを(主に時間によって)照会できるように、履歴データをRedisに格納する機能を追加したいと考えています。分析結果は時間によって分割されるので、結果をRedisに格納するための良い設計は何でしょうか?

+0

はRedisのキー取得のパフォーマンスが直線的に低下することを警戒してくださいあなたが得ている個々のキーの数と一緒に。したがって、大部分の(ほとんど)連続したデータのリストを保存すると、データの時系列の単一文字列表現よりもフェッチするのにN時間かかることになります。 (300の値では問題ありませんが、100kの値には数倍のレイテンシが追加されます)。 –

+0

@ニサン - 私は完全に理解するとは思わない。私は30秒ごとに日付を保存している場合、アプローチ(以下のzsetsを使用)はこのパフォーマンスのペナルティを持ちますか? –

+0

あなたが予想しているサイズのリストを作成し、そこから読み取るのにかかる時間を測定してみてください。リスト全体を文字列として保存してみてください(たとえば、シリアル化されたJSONオブジェクトとして、より多くの圧縮/実行オプションがあります)。私の経験では、均質なデータ型(例えば、最大K桁の整数)の非常に大きなリスト(50k〜500k要素など)の場合、リスト全体をtimeseriesの文字列表現として格納するのは約1000倍高速でしたそれはレディスから読んだ後です。 –

答えて

23

redis sorted setsを使用してください。

ソートセットは「スコア」に基づいてデータを格納します。したがって、場合によってはミリ秒単位でタイムスタンプを使用してください。データはあなたが開始/終了日付の範囲を使用して、履歴項目を取得することができ、自動的にソートされますが、ここでの例だ...

はソートセットに項目を追加...

zadd historical <timestamp> <dataValue> 

は、いくつかを..addサンプルデータ..開始/終了範囲を使用してアイテムのサブセット..retrieve

zadd historical 1 data1 
zadd historical 2 data2 
zadd historical 3 data3 
zadd historical 4 data4 
zadd historical 5 data5 
zadd historical 6 data6 
zadd historical 7 data7 

...

zrangebyscore historical 2 5 

..returns。 ..あなたのケースではそう

1) "data2" 
2) "data3" 
3) "data4" 
4) "data5" 

、あなただけのこの操作を行う、最後の日のためのすべての歴史的なアイテムを取得したい場合は...

zrangebyscore historical <currentTimeInMillis> <currentTimeInMillis - 86400000> 
+0

2つのデータを同じミリ秒で挿入するとどうなりますか? – Lupus

+0

メンバーはソートされたセット内でユニークですが、スコア(この場合はタイムスタンプ)が繰り返されることがあります。 – raffian

+0

各データ値が一意でない場合はどうなりますか? – MasterScrat