ZADD myset 1 ad1
ZADD myset 1 ad2
SET order:ad1 1
SET order:ad2 2
最初に順序集合スコアでソートし、次に順序値でソートする方法は?
(データの保存方法を変更せずに) 結果を保存する場合は、 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"
これらのオブジェクトに新しいプロパティを追加しましょう。
> set order:albert 5
> set order:alfred 3
> set order:casimir 1
> set order:joseph 4
> set order:bertrand 2
新しい順序プロパティで並べ替えることができます:
> sort myset by order:*
1) "casimir"
2) "bertrand"
3) "alfred"
4) "joseph"
5) "albert"
スコアとこの順序プロパティで並べ替える必要がある場合は、zset で順序プロパティを具体化するか、順序プロパティでスコアを具体化する以外に選択肢はありません。
たとえば、zset に order プロパティを追加すると、次のようになります。
> 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」を格納できます。これらは、番号の桁数を表す最初の桁です。
スコアと順序プロパティの両方が変更される可能性がある場合、これはあまり便利ではなく、クライアント側で並べ替えた方がよいでしょう。これは、一方の側でスコアを使用して zset を取得し、もう一方の側で対応する順序値を取得することにより、2 回のラウンドトリップで実現できます。
> zrange myset 0 -1 withscores
> sort myset by order:* get order:* get #
クライアントが 2 つの結果を結合し (ある種の辞書または連想配列を使用)、ソートして最終結果を取得します。