Redis的有序set和解决关系(Redis sorted set and solving ties

2019-08-17 01:19发布

我使用的是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"

我们要考虑second1second2second3作为均具有位置2, fifth有5位。因此,有在第三或第四的位置没有条目。 ZREVRANK是没有用的这里,所以有什么让我找数目的最佳方式是什么?

Answer 1:

在我看来,一个办法是写一个小的Lua脚本,并使用EVAL命令。 产生的操作仍具有对数的复杂性。

例如,假设我们有兴趣的位置second2 。 在脚本中,我们首先得到了分数与ZSCORE ,取得2.然后我们得到与使用比分的第一个条目ZRANGEBYSCORE ,获得second3 。 我们是后的位置,然后ZREVRANKsecond3加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


文章来源: Redis sorted set and solving ties