从redis排序集中,检索得分仅低于给定得分的最高值的等级

时间:2016-12-03 15:43:18

标签: redis

从redis排序集中,如何检索分数低于给定分数的最高值等级

例如,假设我的排序集是:

rank value score
1)   'a'   -10
2)   'd'   -4
3)   'c'   0
4)   'b'   2
5)   'e'   10

具体来说,如果我得到12分,我想要检索等级5.如果我得到分数1,我想要检索等级3.如果我得到分数-11,我想要一无所获。

1 个答案:

答案 0 :(得分:1)

注意#1:排序集中的排名是从0开始的

注意#2:你必须做两个查询,一个用于查找元素,另一个用于获取其排名。

使用redis-cli的示例:

127.0.0.1:6379> ZADD z -10 a -4 d 0 c 2 b 10 e
(integer) 5
127.0.0.1:6379> ZREVRANGEBYSCORE z (12 -inf LIMIT 0 1
1) "e"
127.0.0.1:6379> ZRANK z e
(integer) 4
127.0.0.1:6379> ZREVRANGEBYSCORE z (1 -inf LIMIT 0 1
1) "c"
127.0.0.1:6379> ZRANK z c
(integer) 2
127.0.0.1:6379> ZREVRANGEBYSCORE z (-11 -inf LIMIT 0 1
(empty list or set)

当然,Lua脚本对于这种情况是理想的,即:

$ cat script.lua 
local r=redis.call('ZREVRANGEBYSCORE', KEYS[1], '('..ARGV[1], '-inf', 'LIMIT', 0, 1)
if #r > 0 then
  r=redis.call('ZRANK', KEYS[1], r[1])
end
return r
$ redis-cli --eval script.lua z , 12
(integer) 4
$ redis-cli --eval script.lua z , 1
(integer) 2
$ redis-cli --eval script.lua z , -11
(empty list or set)