4

我正在使用 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,second2second3都具有位置 2 和fifth位置 5。因此在第三或第四位置没有条目。 ZREVRANK在这里没用,那么获取我要查找的号码的最佳方法是什么?

4

1 回答 1

4

在我看来,一种方法是编写一个小 Lua 脚本并使用该EVAL命令。结果运算仍然具有对数复杂度。

例如,假设我们对 的位置感兴趣second2。在脚本中,首先我们使用 获得它的分数ZSCORE,获得 2。然后我们使用获得该分数的第一个条目ZRANGEBYSCORE,获得second3。我们所追求的位置是ZREVRANKsecond31。

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
于 2013-02-18T19:57:39.630 回答