我使用的是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
和second3
作为均具有位置2, fifth
有5位。因此,有在第三或第四的位置没有条目。 ZREVRANK
是没有用的这里,所以有什么让我找数目的最佳方式是什么?
在我看来,一个办法是写一个小的Lua脚本,并使用EVAL
命令。 产生的操作仍具有对数的复杂性。
例如,假设我们有兴趣的位置second2
。 在脚本中,我们首先得到了分数与ZSCORE
,取得2.然后我们得到与使用比分的第一个条目ZRANGEBYSCORE
,获得second3
。 我们是后的位置,然后ZREVRANK
的second3
加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