Redis有序集合で行う複数フィールドでのソートを実装する方法
Redisのソートされたセット(Sorted Set)は、順序付けられた、ユニークで、重複のないデータ構造です。各メンバーはスコア(score)に関連付けられており、スコアを使用してメンバーを並べ替えることができます。
Redisでは、ソート済みセットのメンバーはユニークだが、スコアは重複ありうる。複数のメンバーでスコアが重複している場合、その他のフィールドを使用して順序を指定できる。
マルチフィールドソートを行うための方法は次のとおりです。
- A、Bフィールドを結合し、ソートするカラムを新しいフィールドとして作成し、その新しいフィールドをソート対象のメンバーとして追加する。例えば、AフィールドとBフィールドを基にソートする場合、フィールドを結合した新しいフィールドCを作成し、ソート対象にフィールドCを追加する。
- フィールドAの値をスコアとして、新しいフィールドCを順序集合のメンバーとして追加します。これによりメンバーをフィールドAの値に基づいてソートできます。
- ZINTERSTORE
以下にサンプルコードを示します。
# 将字段A和字段B拼接成字段C
# member1: {"A": 1, "B": 2} -> member1:C = "1:2"
# member2: {"A": 2, "B": 1} -> member2:C = "2:1"
# member3: {"A": 1, "B": 1} -> member3:C = "1:1"
# 将字段A的值作为有序集合的分数
ZADD myset member1:C 1
ZADD myset member2:C 2
ZADD myset member3:C 1
# 按照字段A的值对成员进行排序
ZRANGEBYSCORE myset -inf +inf
# 如果字段A的值相同,按照字段B的值进行排序
ZINTERSTORE myset2 2 myset myset WEIGHTS 0 1
ZRANGEBYSCORE myset2 -inf +inf
上記コードでは、ZADD コマンドを使用して結合された新しいフィールドが整列コレクションのメンバーとして使用され、フィールド A の値がスコアとして使用されています。次に、ZRANGEBYSCORE コマンドを使用して、メンバーがフィールド A の値に従って並べ替えられます。
フィールドAの値が同じものを基準に、ZINTERSTORE コマンドで二つのソート済み集合のフィールドAで交差した結果を計算したら、今度はフィールドBでソートする。最後に、ZRANGEBYSCORE コマンドでフィールドA と フィールドB の値でメンバーをソートする。
Redisのソートされたセットを使用した複数フィールドの並べ替え方法を以下に示します。