2012-10-11 2 views
6

最大数の要素、たとえばNでリーダーボードを作成する必要がありますか? LPUSH + LTRIMを使ってリストサイズをN個の要素に制限する方法を知っています。 Redisのを使用してリーダーボードのためにこれを実装する方法はRedisのリーダーボードをN個の要素に制限する方法はありますか?

をにSortedSet

これまでのところ、私のアプローチは、3つの段階でこれを行うことです。 a)のZADDがリーダーボード

Bにスコア+項目を追加する)N番目のランクを見つけます要素(これを行う方法がわかりません)

c)ZREMRANGEBYRANKリーダーボード0 rank_of_the_nth_elementを実行します。

良い方法がありますか?

答えて

5

私は実際にredisを使用して動作するリーダーボードアプリを持っています。あなたはそれを確認することができますhere。私のアプリでは、リーダボードはトップnのスコアで制限されています。また、古いスコアはあまりにも古くなると落ちます(したがって、日、週、月、年の高得点ボードがあります)。

とにかく、あなたが探しているのは総合的なリーダーボードなので、低い得点が押し出されると思います。レディスソートセットスコアの意味では、高いスコアを残しておくべきである(底にある)ように設定した場合、低いスコアは残すべきです(彼らは一番上にあります):

ZREMRANGBYRANK leaderboard 0 -100 

この例では、最後の100点を保持したいと仮定しています。

スコアが逆転している可能性があります。したがって、「最高得点」が1000の場合は、赤で-1000として保存されるため、最初にソートされたセットになります。その場合、上記と同じであることが、最初の100

を更新した後、すべての項目を削除するにはZREMRANGEBYRANK 100 -1を使用します。ZREMRANGEBYRANKあり実現ので、私の例を簡略化し。

あなたの提案されたソリューションも同様に機能するはずです。あなたがnth要素のスコアを見つけたい場合は、この使用することができます。

hundredth_entry = ZRANGE leaderboard 100 100 
hundredth_score = ZSCORE leaderboard hundredth_entry 
ZREMRANGEBYSCORE leaderboard -inf (hundredth_score 

(は範囲は包括的なので、百分のスコアが削除されます未満のものではなく、百得点しない作ることがあります自体。

1

OPのアルゴリズムのLuaの実装:

redis.call("ZADD", KEYS[1], ARGV[1]+0, ARGV[2]) 
local n = redis.call("ZCARD", KEYS[1]) 
if n > ARGV[3]+0 then 
    redis.call("ZREMRANGEBYRANK", KEYS[1], 0, n-ARGV[3]-1) 
end 

その後

EVAL script 1 key score member cap 

ZADD key score member 

を置き換えます

関連する問題