2012-03-28 4 views
6

Ich frage mich, ob jemand einige Vorschläge machen könnte, wie man sortierte Mengen effizienter macht?Redis: Ausschließen von Werten aus sortierten Mengen basierend auf dem Hash-Feld Wert

Ich arbeite an einem Projekt, bei dem Rankingdaten auf Stundenbasis berechnet und in einer Datenbank gespeichert werden. Die Daten können nach Geschlecht, Land usw. gefiltert werden. Es gibt ungefähr 2 Millionen Zeilen, die verarbeitet werden müssen, und es dauert sehr lange.

Wir möchten zu einem Echtzeitansatz übergehen, bei dem Daten in Redis gespeichert/sortiert/gefiltert werden und eine tägliche saubere Wiederherstellung durchgeführt wird.

In meinem Prototyp erstelle ich einen sortierten Satz für jede mögliche Kombination von Filtern zB: Leaderboard.au.Male, Leaderboard.au.Female, etc. Ich habe diesen Prozess gescriptet, aber sobald Sie jeden Fall behandeln, bedeutet es Es gibt 118 sortierte Sätze erstellt.

Idealerweise hätte ich gerne ein Ranking sortiert und Hash-Sets für jedes Mitglied, das seinen Namen, sein Geschlecht und sein Land enthält. Dann geben Redis nur sortierte Werte basierend auf den benutzerdefinierten Filtern zurück. (z. B. erhalten nur Ranglisten für Männer aus Australien).

Ist dies in Redis nativ möglich?

Antwort

4

Ich schlage vor, Sie halten einen Satz mit der Rangliste für alle Mitglieder:

leaderboard = { id1: score1, id2: score2, ... } 

Und ein Satz für jeden Typ (Geschlecht, Land usw.):

members.male = { id1, id2, ... } 
members.au = { id2, id3, ... } 

Dann haben Sie eine ZINTERSTORE :

zinterstore leaderboard.male 2 leaderboard members.male 

Oder eine Rangliste der männlichen AU-Mitglieder zu bekommen:

zinterstore leaderboard.au.male 3 leaderboard members.male members.au 

kann festlegen, wie die Wertung für den resultierenden sortierte Satz berechnet werden soll WEIGHTS und AGGREGATE verwenden.

Wenn Sie die resultierenden Sets nicht lange behalten möchten, könnten Sie sie dann EXPIRE und nur einen neuen Satz erstellen, wenn dieser nicht existiert.

+0

Danke, dies scheint die flexibelste Lösung zu sein. –

Verwandte Themen