我正在使用 Redis 排序集来存储我正在处理的项目的排名。我们没有预料到(!)我们想要如何处理关系。 Redis 按字典顺序对具有相同分数的条目进行排序,但我们想要做的是对具有相同分数的所有条目给予相同的排名,例如在以下情况
redis 127.0.0.1:6379> ZREVRANGE foo 0 -1 WITHSCORES
1) "first"
2) "3"
3) "second3"
4) "2"
5) "second2"
6) "2"
7) "second1"
8) "2"
9) "fifth"
10) "1"
我们想考虑second1
, second2
and second3
因为两者都具有位置 2,并且fifth
拥有位置 5。因此,第三或第四位置没有条目。ZREVRANK
在这里没有用,那么获得我正在寻找的号码的最佳方法是什么?
在我看来,一种方法是编写一个小 Lua 脚本并使用EVAL
命令。结果运算仍然具有对数复杂度。
例如,假设我们对以下职位感兴趣:second2
。在脚本中,首先我们得到它的分数ZSCORE
,获得 2。然后我们使用该分数获得第一个条目ZRANGEBYSCORE
,得到second3
。我们所追求的位置就是ZREVRANK
of second3
plus 1.
redis 127.0.0.1:6379> ZSCORE foo second2
"2"
redis 127.0.0.1:6379> ZREVRANGEBYSCORE foo 2 2 LIMIT 0 1
1) "second3"
redis 127.0.0.1:6379> ZREVRANK foo second3
(integer) 1
所以脚本可能是这样的
local score = redis.call('zscore', KEYS[1], ARGV[1])
if score then
local member = redis.call('zrevrangebyscore', KEYS[1], score, score, 'limit', 0, 1)
return redis.call('zrevrank', KEYS[1], member[1]) + 1
else return -1 end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)