2012-05-02 15 views

答えて

8

データを格納する方法を変更しないで結果を保存する場合は、SORTコマンドを使用できます。 zsetに適用することができます。例えば

> zadd myset 1 albert 
> zadd myset 1 joseph 
> zadd myset 4 bertrand 
> zadd myset 2 casimir 
> zadd myset 3 alfred 

あなたが値で並べ替えることができます。

> sort myset alpha 
1) "albert" 
2) "alfred" 
3) "bertrand" 
4) "casimir" 
5) "joseph" 

あなたはスコアと値で並べ替えることができます。

> zrange myset 0 -1 
1) "albert" 
2) "joseph" 
3) "casimir" 
4) "alfred" 
5) "bertrand" 

は、今度は、これらに新しいプロパティを追加してみましょうオブジェクト:

ZSETでの順序プロパティを実体よりも、あなたはスコアの順プロパティでソートする必要がある場合

> sort myset by order:* 
1) "casimir" 
2) "bertrand" 
3) "alfred" 
4) "joseph" 
5) "albert" 

は今、あなたは他の選択肢を持っていない、またはマテリアライズ:あなたは新しい秩序のプロパティで並べ替えることができます

orderプロパティのスコアZSET順序プロパティを追加たとえば

、我々は得る:

> del myset 
> zadd myset 1 5:albert 
> zadd myset 1 4:joseph 
> zadd myset 4 2:bertrand 
> zadd myset 2 1:casimir 
> zadd myset 3 3:alfred 
> zrange myset 0 -1 
1) "4:joseph" 
2) "5:albert" 
3) "1:casimir" 
4) "3:alfred" 
5) "2:bertrand" 

注意:その場合、プロパティフィールドは辞書式順序に従ってソートされ、値は正規化されなければならないので数字の順序と複数の数字が必要な場合。これを行うには様々なトリックがあります。たとえば、 "1"、 "12"、 "123"を保存する代わりに、数字の桁数を表す最初の数字 "11"、 "212"または "3123"を保存することができます。

scoreとorderプロパティの両方を変更できる場合、これはあまり便利ではなく、クライアント側でソートする方が効果的です。これは、2回のラウンドトリップで、一方の側でスコアを持つzsetを取得し、他方の側で対応する順序値を取得することによって達成できます。

> zrange myset 0 -1 withscores 
> sort myset by order:* get order:* get # 

クライアントが2つの結果(ある種の辞書または連想配列を使用して)を結合し、最終結果を得るまでソートします。