2013-02-18 116 views
4

我正在使用Redis排序集來存儲我正在處理的項目的排名。我們沒有預料到(!)我們想如何處理關係。 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在這裏沒有用,那麼獲得我要找的號碼的最佳方法是什麼?

回答

4

在我看來,一種方法是寫一個小小的Lua腳本並使用EVAL命令。由此產生的操作仍然是對數複雜的。

例如,假設我們對second2的位置感興趣。在劇本中,我們首先用ZSCORE得到它的得分,然後我們用ZRANGEBYSCORE得到第一個得分,得到second3。我們之後是位置是那麼的second3ZREVRANK加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 
+0

@emostar感謝您的編輯! :)也許我應該接受的答案,但我會等待一些更多upvotes之前接受我自己的答案... – idrarig 2013-07-19 20:41:30

+0

這是我能找到的最簡單的方法...但是然後你的Q和A有完全相同的時間,所以看起來像你剛纔要求寫的答案;) – staackuser2 2013-07-21 01:20:02

+0

@emostar哦,是的,絕對!,現在我記得,我試過「分享你的知識問答風格」的東西!我完全忘了! – idrarig 2013-07-22 10:20:39