7

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

これまでのところ、私のアプローチは 3 つのステップでこれを行うことです: a) リーダーボードにスコア + アイテムを追加する ZADD

b)N番目の要素のランクを見つけます(これを行う方法がわかりません)

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

より良い方法はありますか?

4

2 に答える 2

7

私は実際に、redis を使用する作業中のリーダーボード アプリを持っています。ここで確認できます。私のアプリでは、リーダー ボードはトップnスコアによって制限されており、古いスコアは古すぎると低下します (したがって、日、週、月、年のハイ スコア ボードが存在する可能性があります)。

とにかく、あなたがやろうとしているのは全体的なリーダーボードだと思うので、低いスコアは押しのけられます. Redis Sorted Set スコアの意味で、高いスコアが残り (最下位にある)、低いスコアが残る (上位にある) ように設定した場合、次のようにします。

ZREMRANGBYRANK leaderboard 0 -100

この例では、最後の 100 のスコアを保持することを前提としています。

スコアを反転させると、1000 の「ハイ スコア」が redis に -1000 として保存されるため、ソートされたセットの最初になります。その場合は上記と同じですがZREMRANGEBYRANK leaderboard 100 -1、最初の 100 件以降のすべてのアイテムを削除するために使用します。

更新:私の例がZREMRANGEBYRANK非常に単純化されていることに気づきました。

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

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

(、範囲を包括的にしないようにするためにあります。そのため、100 番目のスコアよりも小さいものはすべて削除されますが、100 番目のスコア自体は削除されません。

于 2012-10-11T20:05:34.550 に答える
2

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

次に交換

ZADD key score member

EVAL script 1 key score member cap
于 2013-11-05T11:37:46.503 に答える