2016-12-03 4 views
0

赤いソートセットから、のスコアがちょうど所定のスコア未満のランクを取得するにはどうすればよいですか? ?例えばredisソートセットから、スコアがちょうど与えられたスコア未満の最高値のランクを取得します。

は、私のソートセットを想像すると、次のとおりです。

rank value score 
1) 'a' -10 
2) 'd' -4 
3) 'c' 0 
4) 'b' 2 
5) 'e' 10 

具体的には、私はスコア12を与えられていた場合、私はスコア1を与えられていた場合、私はランク5を取得したい、私がしたいですランク3を取得します。私がスコア-11を与えられた場合、私は何も検索しません。

答えて

1

ノート#1:ソートセットでのランクは0ベースの

ノート#2:あなたは、2つのクエリ、そのランクを取得するための要素と他のを見つけるための1つを行う必要があるでしょう。

redis-cliを用いて実施例:

127.0.0.1:6379> ZADD z -10 a -4 d 0 c 2 b 10 e 
(integer) 5 
127.0.0.1:6379> ZREVRANGEBYSCORE z (12 -inf LIMIT 0 1 
1) "e" 
127.0.0.1:6379> ZRANK z e 
(integer) 4 
127.0.0.1:6379> ZREVRANGEBYSCORE z (1 -inf LIMIT 0 1 
1) "c" 
127.0.0.1:6379> ZRANK z c 
(integer) 2 
127.0.0.1:6379> ZREVRANGEBYSCORE z (-11 -inf LIMIT 0 1 
(empty list or set) 

当然、Luaのスクリプトはこの場合のために理想的であろう、すなわち:

$ cat script.lua 
local r=redis.call('ZREVRANGEBYSCORE', KEYS[1], '('..ARGV[1], '-inf', 'LIMIT', 0, 1) 
if #r > 0 then 
    r=redis.call('ZRANK', KEYS[1], r[1]) 
end 
return r 
$ redis-cli --eval script.lua z , 12 
(integer) 4 
$ redis-cli --eval script.lua z , 1 
(integer) 2 
$ redis-cli --eval script.lua z , -11 
(empty list or set) 
関連する問題