2011-09-14 18 views
4
parent = { 
    child0: { 
     data1:'foo', 
     data2: 'bar' 
    }, 
    child1: { 
     data1:'foo', 
     data2: 'bar' 
    }, 
    child2: { 
     data1:'foo', 
     data2: 'bar' 
    } 
} 

最初に私はparent:childキーを設定すると思っていました。私は兄弟のデータを個別に必要とするからです。しかし、場合によっては、親の中のすべてのデータを返す必要があります。このオブジェクトをRedisにどのように保存する必要がありますか?

オブジェクト全体をparentキーに入れてください。

多くの取得とセットが子供のためだけである場合、これには欠点がありますか?

parent:childスキーマを持つすべての親データを呼び出す方法はありますか?

ありがとうございます!

答えて

2

ハッシュを試してみましょう。これは、1人の子供を得るためにHGETを与え、すべてを得るためにHGETALLを与えます。

オブジェクト全体を単一のキーに格納することも有効ですが、使い方が適切であればコードを単純にしておきます。数値が大きすぎない場合は、子オブジェクトを1つだけ表示する必要がある場合でも、常にオブジェクト全体を取得することができます。

複雑なオブジェクトを単一のキーに格納しないようにする主な理由は書き込み競合です.2つの接続で同時に1つのオブジェクトの異なる子を変更できる場合は、ハッシュがずっと問題になりません。

+0

ああ、はい、すべての子オブジェクトは同時に編集されます。私はこれをできるだけ単一のキーで避けるべきですか? – fancy

+0

yes - redisは十分に速いので、競合が起こりそうもないが、最も利便性の低いポイントで発生し、バグを見つけにくくなる。ハッシュまたは複数のキーでは、各項目は独立しているので、競合は不可能です。 –

+0

ああ、2人の異なる子供が同時に変更されているときに競合を緩和するハッシュ機能を使用している場合、 – fancy

0

ハッシュデータ型を利用するとよいでしょう。親をハッシュのキーとして使用し、特定の子の場合は(HGETキーフィールド)、すべての子の場合は(HKEYSキー)を使用します。

誰かがハッシュコマンドHSETとHGETのベンチマークを投稿すると面白いでしょう。リスト操作(LPUSH 88109.25/sec)のベンチマークは(〜114%)遅くなります(SET 114293.71/sec)。おそらくHSETは、O(1)と表記されていますが、まだ遅いです。

私はあなたのコード内の個々の子リクエストに対するフルファミリーリクエストの割合を調べることで、スピードを最適化すると思います。

+0

アドバイスをいただきありがとうございます。子プロセスが本質的に同時に設定される場合はどうでしょうか? HGET/HSETはこれらの不一致を管理できますか? – fancy

+0

私は最初にトランザクションについて話していると思っていましたが、複数のハッシュ値(子)を同時に設定するときは、HMSETコマンドを探していると思います。 –

関連する問題