maj*_*oat 5 pagination sortedset redis
考虑具有以下成员的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"
Run Code Online (Sandbox Code Playgroud)
如果我想以相反的顺序进行分页,从任意切片开始,我可以从这开始:
// Returns G, F, E, as expected.
ZREVRANGEBYSCORE mySortedSet 72 (46
Run Code Online (Sandbox Code Playgroud)
现在,只知道我的上限是46,我可以得到集合中的前3个项目,D,C和B,而不知道下限:
ZREVRANGEBYSCORE mySortedSet 46 -inf LIMIT 0, 3
Run Code Online (Sandbox Code Playgroud)
我的问题是,我怎么能按顺序得到集合中的下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
Run Code Online (Sandbox Code Playgroud)
我认为我想要的是负偏移,我认为不支持.
// Would return J, I, H, but actually returns an empty set.
ZREVRANGEBYSCORE mySortedSet +inf (72 LIMIT -1, 3
Run Code Online (Sandbox Code Playgroud)
我可以用前进范围伪造它,然后反转这些项目,但我正在寻找一个原生的Redis解决方案,如果存在的话.
// Returns H, I, J - the items I want, but reversed.
ZRANGEBYSCORE mySortedSet (72 +inf LIMIT 0, 3
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
要清楚,我知道有ZRANGE和ZREVRANGE,但在这个查询配置文件中,我不知道实际索引,只是得分.
获取元素的排名然后按索引进行工作很简单。假设您的应用程序可用的唯一输入是初始分数范围 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>
Run Code Online (Sandbox Code Playgroud)
唯一的额外调用是 O(log(N))ZREVRANK调用。从那里,需要进行一些客户端数学运算来获取您感兴趣的范围的新索引,并ZREVRANGE获取您想要的值。
我在 Redis 2.6rc5 上对此进行了测试,但它应该适用于 2.0 以上的任何版本。
| 归档时间: |
|
| 查看次数: |
2805 次 |
| 最近记录: |