2

ソートされたセットに6つのデータを追加しました。次に、zinterstoreを使用して期待される結果を取得します。しかし、結果は0です。

zadd la.41 41 kfc
zadd la.42 42 mdl
zadd la.43 43 apple

zadd lo.77 77 apple
zadd lo.78 78 mdl
zadd lo.79 79 kfc

zinterstore close 6 la.41 la.42 la.43 lo.77 lo.78 lo.79

期待される結果:

kfc
mdl
apple

実結果:

0

なぜ ?ありがとう。

4

2 に答える 2

5

誤解ZADDして意図したよりも多くのセットを作成しているか、ユニオンを使用する必要があるときに交差を使用しているようです。両方を見てみましょう:

より少ないセットを作成する

潜在的な問題の1つは、6つのセットを作成しているのに、代わりに2つのセットを作成したい場合があることです。集合の内包的記法では、これを行っています。

la.41 = {kfc}
la.42 = {mdl}
la.43 = {apple}

代わりに、これを実行したい場合:

la = {kfc, mdl, apple}

これがあなたがやろうとしていることであるなら、あなたはZADDコマンドを誤解しています。

ZADDキー、スコア、およびメンバーを取ります。キーはセットの名前、メンバーはセットに追加するもの、スコアはセット内のメンバーの位置と考えることができます。

たとえば、コマンドを実行すると、スコアが。のメンバーを持つZADD foo 1 aというセットが作成されます。スコアを1秒間無視すると、状況は次のようになります。fooa1

foo = {a}

ここで実行すると、既存のセットZADD foo 2 bにメンバーが追加されます。bfoo

foo = {a, b}

各コマンドで異なるキーを使用しているZADDため、各コマンドで新しいセットを作成しています。同じキー、つまり同じセットを使用する場合:

ZADD la 41 kfc
ZADD la 42 mdl

最終的に単一のセットを作成します。

la = {kfc, mdl}

ユニオン対交差点

別の方法は、 6つのセットを作成たいが、交差ではなくユニオンが必要なことです。

2つのセットの集合は、元のセットのいずれかに存在していたすべての要素を含むセットです。

{1, 2} ∪ {2, 3} = {1, 2, 3}

2つのセットの共通部分は、元のセットの両方に存在していたすべての要素を含むセットです。

{1, 2} ∩ {2, 3} = {2}

共通の要素を持たない6つのセットを作成し、それらの共通部分を取得します。

{kfc} ∩ {mdl} ∩ {apple} ∩ {kfc} ∩ {mdl} ∩ {apple} = {}

代わりにユニオンを使用している場合は、結果のセットにすべての要素が含まれることになります。

{kfc} ∪ {mdl} ∪ {apple} ∪ {kfc} ∪ {mdl} ∪ {apple} = {kfc, mdl, apple}

ZUNIONSTOREこれは、の代わりにRedisコマンドを使用して実現できますZINTERSTORE

于 2012-05-25T06:32:51.657 に答える
3

ソートされたセットが何であるかを本当に理解していなかったと思います。これは、データ構造の順序を提供するスコアを持つ各アイテムのセットです。各アイテムのスコア自体は、アイテムのIDの一部ではありません。

ここでは、6つの異なるソート済みセットを作成します。各セットには、1つのアイテムのみが含まれます。一部の並べ替えられたセットには同じアイテムがありますが、並べ替えられたすべてのセットにアイテムが存在するわけではありません。したがって、予想どおり、これらのセットの共通部分の結果は空です。

ちなみに、zinterstoreコマンドの結果はアイテムのリストではなく、結果のカーディナリティです。セットのコンテンツを取得するには、追加のコマンドが必要です。

例:

> zinterstore close 2 la.41 lo.79
(integer) 1
> zrange close 0 -1
1) "kfc"
于 2012-05-25T06:03:58.630 に答える