2012-10-11 5 views
6

Ich muss eine Bestenliste mit der maximalen Anzahl von Elementen erstellen, sagen wir N? Ich weiß, wie man LPUSH + LTRIM benutzt, um eine Listengröße auf N Elemente zu begrenzen. Wie implementieren diese für Rangliste eines Redis mit SortedSetWie man eine Bestenliste in Redis auf nur N Elemente begrenzt?

Bisher mein Ansatz ist dies in 3 Schritten zu tun: a) ZADD eine Partitur + Element an den Rang

b) findet den Rang der N-ten hinzufügen Element (ich bin mir nicht sicher, wie ich das machen soll)

c) Führe ein ZREMRANGEBYRANK Leaderboard 0 rank_of_the_nth_element.

Gibt es einen besseren Weg?

Antwort

5

Ich habe tatsächlich eine funktionierende Leaderboard App, die Redis verwendet. Sie können es überprüfen here. In meiner App sind die Bestenlisten durch die oberen n Punkte begrenzt, und auch alte Punkte fallen ab, wenn sie zu alt sind (so kann es Tag, Woche, Monat, Jahr hohe Anzeigetafeln geben).

Wie auch immer, ich denke, was Sie suchen, ist eine Gesamtführung, so niedrige Punktzahlen werden abgeschoben. Im Sinne der Redis Sorted Set Partituren, wenn Sie es so eingerichtet haben, dass Highscore erhalten bleiben sollte (sie sind am unteren Rand) und niedrige Scores sollten (sie sind am oberen Rand), dann würden Sie etwas tun wie:

ZREMRANGBYRANK leaderboard 0 -100 

In diesem Beispiel wird davon ausgegangen, dass Sie die letzten 100 Werte beibehalten möchten.

Vielleicht invertieren Sie die Scores, so dass ein "Highscore" von 1000 als -1000 in redis gespeichert wird, also das erste in der sortierten Menge. In diesem Fall wäre es das gleiche wie oben, aber ZREMRANGEBYRANK 100 -1 alle Einzelteile nach dem ersten 100.

-Update löschen verwenden: Realisiert ist es ZREMRANGEBYRANK so vereinfacht mein Beispiel.

Ihre vorgeschlagene Lösung sollte auch funktionieren. Wenn Sie die Partitur des nth Element finden möchten, können Sie diese verwenden:

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

Die ( dort der Bereich nicht inklusive zu machen, so etwas weniger als die Hundertstel-Score wird gelöscht, aber nicht den hundertsten Punktzahl selbst.

1

A lua Implementierung des Algorithmus des OP:

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 

Dann

ZADD key score member 

mit

EVAL script 1 key score member cap 
ersetzen
Verwandte Themen