从redis排序集中,如何检索分数低于给定分数的最高值等级?
例如,假设我的排序集是:
rank value score
1) 'a' -10
2) 'd' -4
3) 'c' 0
4) 'b' 2
5) 'e' 10
具体来说,如果我得到12分,我想要检索等级5.如果我得到分数1,我想要检索等级3.如果我得到分数-11,我想要一无所获。
答案 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)