1

Redis は素晴らしいです !

「set1 = key1:100、key2:200、key3:300」のような2つのソートされたセットがある場合

「set2 = key1:1, key2:2, key3:3」のようなもの

次に、このようにすることは可能ですか - set3 = key1:100_1, key2:200_2, key3:300_3

同じキーの値を追加したり、同じキーの最小値/最大値を取得したりしたくありません。これらの値を一緒に取得することは可能ですか? 同じキーに対して、これらの値の両方をまとめて取得したいと考えています。

4

1 に答える 1

1

ソートされたセットのスコアは数値でなければならないため、交差/和集合操作でスコアの単純な連結を返すことはできません。

ただし、各セットのスコアの値を特定の範囲に制限できる場合は、SUM 演算を使用して、単純な算術演算で 2 つの値を 1 つの値にエンコードすることができます。

例:

# For s1, we assume the score is between 0 and 999
> zadd s1 100 key1 200 key2 300 key3
(integer) 3
# For s2, we assume the score is between 0 and 99
> zadd s2 1 key1 2 key2 3 key3
(integer) 3

# Get the intersection, dividing the s2 score by 100
> zinterstore s3 2 s1 s2 WEIGHTS 1 0.01
(integer) 3

# Get the result with scores
> zrange s3 0 -1 withscores
1) "key1"
2) "100.01000000000001"
3) "key2"
4) "200.02000000000001"
5) "key3"
6) "300.02999999999997"

結果のスコアでは、整数部分には s1 からのスコアが含まれ、小数部分には s2 からのスコアが含まれます。

スコアは倍精度浮動小数点数であることに注意してください。それにはいくつかの結果があります:

  • 整数のみを操作する場合は、適切に丸める必要がある場合があります (つまり、0.0299999... は実際には 0.03 です)。

  • 2 つの数値を 1 つにエンコードすると、精度が 2 で除算されます (16 桁から 8 桁のみ)。ニーズに合う場合と合わない場合があります。

于 2013-04-02T07:47:36.953 に答える