2016-04-22 9 views
0

Ich habe Hunderte von Fußballspielen in meiner Redus-Datenbank gespeichert. Sie werden in Hashes unter dem Schlüssel gespeichert: games:soccer:data Ich habe drei Z-Sätze, um sie in bevorstehende, lebende und beendete zu klassifizieren. Alle nach Datum sortiert (Score). Auf diese Weise kann ich sie leicht abrufen, abhängig davon, ob sie bald beginnen werden, sie sind bereits im Gange, oder sie sind bereits beendet. Jetzt möchte ich in der Lage sein, sie nach Liga-Namen abzurufen.Was ist der beste Weg, um Fußball-Spiele nach Liga-Namen in Redis abrufen?

kam ich mit zwei Alternativen auf:

Erste Alternative: speichert einzelne Hashes die Spiel-ID und die Liganamen enthalten. Auf diese Weise kann ich alle Live-Spiel-IDs abrufen und dann jede ID mit ihren entsprechenden Hashes vergleichen, wenn sie mit den gewünschten Liga-Namen übereinstimmt, dann schiebe ich sie in ein Array, wenn nicht, überspringe ich sie. Schließlich, gebe das Array mit allen Spiel-IDs für die Ligen, die ich wollte, zurück.

Zweite Alternative: erstellen Schlüssel für jede Liga und haben zu leben, kommenden und endete Sets für jeden. Auf diese Weise, denke ich, wäre es schneller, die Spiel-IDs zu erhalten; es wäre jedoch ein Schmerz, jeden Satz zu erhalten.

Wenn Sie eine andere Möglichkeit haben, lassen Sie es mich wissen. Ich weiß nicht, ob das Sortieren schneller wäre und rette mir etwas Speicher.

Ich bin auf der Suche nach Geschwindigkeit und geringem Speicherverbrauch.

EDIT (nach hobbs Alternative):

 const multi = client.multi(); 
     const tempSet = 'users:data:14:sports:soccer:lists:temp_' + getTimestamp(); 

     return multi 
     .sunionstore(
     tempSet, 
     [ 
      'sports:soccer:lists:leagueNames:Bundesliga', 
      'sports:soccer:lists:leagueNames:La Liga' 
     ] 
    ) 
     .zinterstore(
     'users:data:14:sports:soccer:lists:live', 
     2, 
     'sports:lists:live', 
     tempSet 
    ) 
     .del(tempSet) 
     .execAsync() 

Ich brauche AGGREGATE MAX auf meine Frage zu setzen, und ich habe keine Ahnung, wie.

Antwort

0

Ein Weg wäre, ein SET zu verwenden, das alle Spiele für jede Liga enthält, und ZINTERSTORE zu verwenden, um die Schnittmenge zwischen Ihren Liga-Sätzen und Ihren vorhandenen Sätzen zu berechnen. Sie können den ZINTERSTORE bei jeder Abfrage der Daten ausführen (das ist keine sehr kostspielige Operation, es sei denn, Ihre Daten sind sehr groß) oder Sie können sie nur beim Schreiben in einen der "Eltern" -Sets verwenden, oder Sie können sie als Art von Cache, indem Sie ihm eine kurze TTL geben und es nur erstellen, wenn es nicht existiert, wenn Sie es abfragen.

+0

Was passiert, wenn dieses SET, das alle Spiele für jede Liga enthält, mit Tausenden von Einträgen sehr groß wird? Ist seine Größe wichtig? – ElPirru

+0

@ElPirru ist es wichtig, aber Tausende ist nicht "sehr groß" und wahrscheinlich kein Problem. Aber erstellen Sie einige Testdaten und messen Sie die Leistung! – hobbs

+0

Ich werde einige Tests durchführen und die Ergebnisse zurücksenden. Ich könnte Spiele löschen, die älter sind als x Zeit, um die Größe "klein" zu halten oder zwei SETs zu haben, eins mit Spielen neuer als ein Monat und die andere Liste mit dem Rest der Spiele. Was, wenn ich die Liga eines Spiels von seinem Hash zurückhole und dann einen neuen Satz von dort mache? Dies würde die Sortierfunktion verwenden, die ich errate .... – ElPirru