2011-12-29 6 views
1

イベントのリストをレディスのタ​​イムラインに保存したいと思います。私はスコアとして1970年以来秒単位のソートされたセットを考えていて、クイックルックアップとレンジ検索が可能です。レディスでのイベントタイムラインの保存

問題は、これらのイベントのそれぞれがいくつかのキー(約3つ)でオブジェクトを表現したいので、ソートされた一連のIDを格納します。アプリケーションは、 ID。

だから会話はこのような何かを行くだろう:
> ZRANGEBYSCORE events start end 
1) "16" 
2) "17" 
> HGETALL events:16 
1) "key1" 
2) "val1" 
... 
> HGETALL events:17 
... 

が整理したり、それぞれの結果のために別々の呼び出しを行うアプリケーションを避けるだろう物事を行うには良い方法があります。このオーバーヘッドを避けるために、redis-server側ですべてを実行できますか?それは大きな問題ですか?

PS。私はノードクライアントを使用していますが、私の質問は他の言語にも当てはまります。

答えて

2

でそれを取得することができます。したがって、zsetは、これらのオブジェクトに参照を格納するのではなく、シリアル化されたオブジェクトを格納できます。ノードを使用すると、JSONを使いやすくなります。

現在の構造を保持する必要がある場合(オブジェクトのいくつかはさまざまなzsetsによって共有されるため)、コマンドではなく、ルントリップという言葉で考える必要があります。レディスでは高価なものは往復であり、実際はO(1)コマンドそのものではありません。

HGETALLは可変パラメータをサポートしていません(つまり、1つのハッシュオブジェクトしか取得できません)。しかし、Redisはパイプライン化されたコマンドを処理する上で非常に優れています。これは、ノードの非同期性のためnode_redisドライバから特に簡単です。したがって、あなたの例では、ZRANGEBYSCOREを実行する最初のものと、すべてのHGETALLコマンドを実行する(つまり、最初のHGETALLコマンドの結果を待ってから2番目のコマンドを実行する)2回のラウンドトリップが必要です。それは非常に効率的です。

現在のRedisバージョン(2.4)では、2回目の往復を排除する方法はありません。

+0

私たちは、この正確なアプローチを類似のものに使用します。また、Redisのスクリプトブランチでは、1回のトリップでこれを行うことができます。 – tddmonkey

+0

この情報をすべて1つのフィールドに格納することには欠点はありませんか? rdbmsフィールドにcsvを格納するのと同じですか?それはスピードのトレードオフですか? – Adam

+0

オブジェクトが小さい場合は、実際の欠点はありません。オブジェクトが大きく、部分的な更新をサポートしたい場合や、さまざまなコンテナからオブジェクトを共有する場合は、欠点があります。 csvに関するあなたの発言に関しては、すべてのデータベースシステムは行(DB2、PostgreSQL、Oracleなど)を直列化する必要があります。それらのほとんどは可変長データをサポートしています(区切り文字またはサイズ接頭辞付き)。彼らが使用するフォーマットはバイナリで最適化されていますが、複雑さの点でシリアライズのコストはシンプルなcsvのローで得られるものとそれほど変わりません。 –

1

あなたは、オブジェクトを文字列化してstringwith JSON.stringify()として保存して、明白な解決策は、値の代わりに、参照することによって働くことによって動作することであるJSON.parse()

関連する問題