2

私は Redis とキー値データベースの初心者です。このリレーショナル アプローチを redis で正しく実現する方法について教えてください。

1 つの値に対して 2 つのキーを持つリレーショナル テーブルがあります。

-master_id; -slave_id; -価値。

例:

master_id | スレーブ ID | 価値

1 | 1 | val1

2 | 1 | val2

通常、値へのアクセスは master_id フィールドによって行われますが、場合によっては、slave_id フィールドによって選択 (または削除) する必要があります。したがって、2 つのフィールド (master_id または slave_id) によって単一の値を取得できます。私が理解しているように、redis では、すべてのキーが 1 つの値を意味します。価値を重複させずにこれを実行する最良の方法は何ですか? 注: 値フィールドは、SET またはリスト タイプである必要があります。

redis には次のものがあります。

1:1 val1 2:1 val2

そして、フルキー 1:1 または 2:1 でのみ値にアクセスできます。この DEL * :1 (2 番目の部分が 1 に等しいすべてのキーを削除する) または GET 1: * (キーの最初の部分が 1 に等しいすべてのキーを取得する) のようなものを作成することはできません。

4

2 に答える 2

0

この例では、主キーが master_id なのか (master_id,slave_id) なのかわかりません。私は後者を想定しています。

通常、リレーショナルの概念をキー/値ストアにマッピングしようとしても無意味です。Redisはデータ構造のサーバーなので、データ構造とアクセスパスを考える必要があります。あなたはしたい:

  • 値を一度保存​​する
  • master_id フィールドの値にアクセスできる
  • slave_id フィールドの値にアクセスできる

必要なもの:

  • 値を識別する数値キー
  • 対応する値にインデックスを付けるための master_id ごとのセット
  • 対応する値にインデックスを付けるための、slave_id ごとのセット

例:

SET value:1001 val1
SET value:1002 val2
SADD master:1 1001
SADD master:2 1002
SADD slave:1 1001 1002

特定のマスター ID に対応する値を取得するには:

SMEMBERS master:id
MGET <result of the previous command with a value: prefix>

特定のスレーブ ID に対応する値を取得するには:

SMEMBERS slave:id
MGET <result of the previous command with a value: prefix>

マスター id1 とスレーブ id2 に対応する値を取得するには:

SINTER master:id1 slave:id2
MGET <result of the previous command with a value: prefix>

SORT コマンドを使用して、ラウンドトリップの回数を減らすようにさらに最適化できます。この回答の例を参照してください。

もちろん、master_id が実際に主キーである場合は、値を識別するために追加のキーを導入する必要がないため、単純化できます。

于 2012-04-04T20:39:06.163 に答える
0

値の重複を避けるために、次のような単純なキーと値のペアを使用できます。

  • master_id : 値

  • スレーブ ID : マスター ID

これには、slave_id で値を取得/削除/変更するために、サーバーに対して 2 回クエリを実行する必要があるという欠点があります。(最初にslave_idを照会すると、サーバーはmaster_idがあればそれで応答し、次にmaster_idに照会して関連する値を使用します)。ただし、 LUA スクリプトが登場すれば、これは問題になりません。

于 2012-04-04T20:37:34.533 に答える