3

私は現在、次のようなデータセットを持っています:

チャネル 1 = ユーザー 1、ユーザー 2、ユーザー 3

チャネル 2 = ユーザー 4、ユーザー 5、ユーザー 6

(注 - これらは実際の名前ではなく、テキストは予測可能なシーケンスではありません)

次の機能を最大限に最適化したいと考えています。

1) ユーザーをチャンネルに追加する

2) チャンネルからユーザーを削除する

3) 選択したいくつかのチャネルのすべてのユーザーのリストを取得し、ユーザーがどのチャネルにいるのかを把握します (重要な場合は、実際のユーザーのリストを取得せずに、チャネルにユーザーがいるかどうかを単純に確認することもできます)。

4) 特定のユーザーがチャンネルにいるかどうかを検出します (必要に応じてこの機能を差し控えます)。

一度に複数のキーを取得する方法が 2 つしかないという事実に、私は少し夢中になっています。

A) 通常のキーと mget key1、key2、key3 を使用する

  • このソリューションでは、各値は JSON 文字列になり、クライアント側で操作およびクエリを実行して、値を追加/削除/決定できます。これ自体にはいくつかの問題があります。まず、処理中に別のクライアントがデータを変更する可能性があり (つまり、このソリューションはアトミックではありません)、チャネルに特定のユーザーが含まれているかどうかをすぐに検出するのは簡単ではありませんが、チャネルにユーザーがいるかどうかを検出します (上記のように、これは優先度が低くなります)

B) セットとサニオンの使用

  • どういうわけかこのソリューションにセットを使用したいのですが、上記のソリューションは間違っているようです...しかし、一度に複数のセットを照会し、各メンバーがどのセットからのものか、またはセットのいずれかに関する情報を維持する方法がわかりません組合には0人のメンバーがいます(sunionは、結合されたすべてのメンバーの最終セットのみを提供します)

上記のポイント1〜4を最適な時間とアトミック操作で実装できるソリューションはありますか?

編集:私の特定のケースで機能する可能性のあるアイデアの1つは、チャネル名をユーザー名の一部として保存し、セットを使用することです。それでも、より一般的な答えを得ることは素晴らしいことです

4

1 に答える 1

3

簡単な答え: セット + パイプライン + MULTI/EXEC、またはセット + Lua を使用します。

1) ユーザーをチャンネルに追加する

SADDコマンド

2) チャンネルからユーザーを削除する

SREMコマンド

3) 選択した複数のチャネルのすべてのユーザーのリストを取得する

それにはいくつかの方法があります。

厳密な原子性が必要ない場合は、複数のSMEMBERSコマンドをパイプライン処理して、1 回のラウンドトリップですべてのセットを取得するだけです。チャネルにユーザーがいるかどうかだけに関心がある場合は、 SMEMBERS をSCARDに置き換えることができます。

厳密な原子性が必要な場合は、SMEMBERS または SCARD コマンドを含む MULTI/EXEC ブロックをパイプライン処理できます。EXEC コマンドの出力には、すべての結果が含まれます。これが私が推奨する解決策です。

別の (アトミックな) 方法は、 EVALコマンドを使用してサーバー側の Lua スクリプトを呼び出すことです。Lua スクリプトの実行は常にアトミックです。スクリプトは、入力パラメーターとして多数のチャンネルを受け取り、マルチレイヤーの一括返信を作成して出力を返すことができます。

4) 特定のユーザーがチャンネルにいるかどうかを検出する

SISMEMBERコマンド - 複数のユーザーを確認する必要がある場合はパイプライン処理します。

于 2013-09-30T17:50:38.053 に答える