22

100 から 1000 個の文字列のセット (またはソートされたセットまたはリストの方がよい場合) があるとします。

次に、100 万など、さらに多くの文字列の並べ替えられたセットBがあります。

ここで、 CはAB (もちろん文字列)の交点になるはずです。

X がCにあるすべてのタプル (X, SCORE_OF_X_IN_B) が必要です。

何か案が?

私は2つのアイデアを得ました:

  1. インターストア
    • すべてのスコアが 0 であるソートされたセットをストア A
    • インターストアからDへ
    • D のすべての項目を取得する
    • Dを削除
  2. クライアントの単純なループ
    • クライアント プログラムで A をループする
    • すべての文字列の zscore を取得する

1. redis 側のオーバーヘッドが多すぎます (たとえば、書く必要があります。redis ページには、時間の複雑さが非常に高く、あまりにもhttp://redis.io/commands/zinterstoreと記載されています)、2. は |A| を持ちます。データベース接続があり、良い選択ではありません。

zscore のように機能するが、任意の数の文字列を使用する redis/lua スクリプトを作成できるかもしれませんが、ホスティング会社がスクリプトを許可しているかどうかはわかりません...

だから、スクリプトなしで利用できるエレガントで高速なソリューションがあるかどうか、SOに尋ねたかっただけです!

4

1 に答える 1

42

あなたの問題には簡単な解決策があります: ZINTERSTOREaSETと a で動作しZSETます。試す:

redis> sadd foo a
(integer) 1
redis> zadd bar 1 a
(integer) 1
redis> zadd bar 2 b
(integer) 1
redis> zinterstore baz 2 foo bar AGGREGATE MAX
(integer) 1
redis> zrange baz 0 -1 withscores
1) "a"
2) "1"

編集:AGGREGATE MAX redis は (ソートされていない) セットの各メンバーにfooデフォルトのスコア を1与えるため、上で追加しましSUMbar

于 2012-05-08T15:37:26.727 に答える