从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的
注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)

关于redis - 从redis排序集中,检索得分仅低于给定得分的最高值的等级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40949531/

10-15 10:00