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、両方とも位置2を持ち、位置5を持っていると見なします。したがって、3番目または4番目の位置にエントリはありません。 ここでは役に立たないので、探している番号を取得するための最良の方法は何ですか?second2second3fifthZREVRANK

4

1 に答える 1

4

一つの方法は、小さなLuaスクリプトを書いて、EVALコマンドを使用することだと私には思えます。結果として得られる操作は、依然として対数的に複雑です。

たとえば、の位置に関心があるとしsecond2ます。スクリプトでは、最初に、でスコアをZSCORE取得し、2を取得します。次に、を使用してそのスコアで最初のエントリを取得しZRANGEBYSCORE、を取得しsecond3ます。その場合、私たちが求めている位置はZREVRANKプラスsecond31です。

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 に答える