5

次のメンバーを持つ Redis の並べ替えられたセットを考えてみましょう。

ZADD mySortedSet 11 "A"
ZADD mySortedSet 21 "B"
ZADD mySortedSet 32 "C"
ZADD mySortedSet 46 "D"
ZADD mySortedSet 53 "E"
ZADD mySortedSet 68 "F"
ZADD mySortedSet 72 "G"
ZADD mySortedSet 82 "H" 
ZADD mySortedSet 94 "I"
ZADD mySortedSet 104 "J"
ZADD mySortedSet 113 "K"

任意のスライスから開始して、逆の順序でページネーションを行いたい場合は、次のように開始できます。

// Returns G, F, E, as expected.
ZREVRANGEBYSCORE mySortedSet 72 (46

ここで、上限が 46 であることだけがわかれば、次のようにして、下限を知らなくても、セット内の前の 3 つのアイテム D、C、および B を取得できます。

ZREVRANGEBYSCORE mySortedSet 46 -inf LIMIT 0, 3

私の質問は、セット内の次の 3 つの項目 J、I、H をこの順序で取得するには、上限が 72 であることだけを知っているのでしょうか?

// Good start, returns K, J, I, H
ZREVRANGEBYSCORE mySortedSet +inf (72

// Returns K, J, I, due to the offset of 0.  I don't know what the correct offset is because it's from the start of the range, not the end.
ZREVRANGEBYSCORE mySortedSet +inf (72 LIMIT 0, 3

私が欲しいと思うのは、サポートされていないと思う負のオフセットです。

// Would return J, I, H, but actually returns an empty set.
ZREVRANGEBYSCORE mySortedSet +inf (72 LIMIT -1, 3

前方範囲でそれを偽装してから、それらの項目を元に戻すことができますが、ネイティブの Redis ソリューションが存在する場合はそれを探しています。

// Returns H, I, J - the items I want, but reversed.
ZRANGEBYSCORE mySortedSet (72 +inf LIMIT 0, 3

何か案は?

明確にするために、ZRANGE と ZREVRANGE があることは知っていますが、このクエリ プロファイルでは、実際のインデックスはわかりません。スコアだけです。

4

1 に答える 1

1

要素のランクを取得し、インデックスで作業するのは簡単です。アプリケーションで使用できる唯一の入力が 72 と 46 の初期スコア境界であると仮定すると、次のようにすることができます。

redis 127.0.0.1:6379> ZREVRANGEBYSCORE mySortedSet 72 (46
1) "G"
2) "F"
3) "E"
redis 127.0.0.1:6379> ZREVRANK mySortedSet G
(integer) 4
redis 127.0.0.1:6379> ZREVRANGE mySortedSet 1 3
1) "J"
2) "I"
3) "H"
redis 127.0.0.1:6379> 

唯一の追加の呼び出しは、O(log(N))ZREVRANK呼び出しです。そこから、関心のある範囲の新しいインデックスを取得し、必要なZREVRANGE値を取得するのは、クライアント側の計算です。

これを Redis 2.6rc5 でテストしましたが、2.0 以上のどのバージョンでも動作するはずです。

于 2012-07-31T17:13:15.053 に答える