Redis-Daten-Struktur-design für die Sortierung von Zeit-basierten Werte

Ich bin das durchführen einer Analyse eines Datenstroms und die Veröffentlichung der Ergebnisse auf einer Redis-Kanal. Verbraucher abonnieren Sie diese Kanäle und Echtzeit-Daten-feeds. Alle historischen Daten-Analyse-Ergebnisse verloren.

Nun möchte ich hinzufügen, dass die Möglichkeit zur Speicherung von historischen Daten in Redis, so dass die Verbraucher Abfragen können, diese historische Daten (vor allem durch die Zeit). Da die Ergebnisse der Analyse werden anhand der Uhrzeit partitioniert, was wäre den ein gutes design zu speichern die Ergebnisse in Redis?

  • Seien Sie vorsichtig, dass redis Schlüssel-immer die Leistung verringert sich Linear mit der Anzahl der einzelnen Tasten, die Sie hier bekommen. Also, wenn Sie gespeichert eine große Liste von (meist) zusammenhängende Daten, die es dauern würde, N-mal mehr zu Holen, als ein single-string-Darstellung des timeseries Daten. (Kein Problem, für 300 Werte... aber mehrere Größenordnungen von Latenz für 100k Werte).
  • Ich glaube nicht, dass ich völlig verstehen. Wird der Ansatz (mit zsets unten), wird diese performance-Einbußen wenn ich die Speicherung von Datum alle 30 Sekunden.
  • Versuchen Sie, füllen eine Liste, die Größe, die Sie erwarten, es zu sein, und Messen wie lange es dauert, Sie zu Lesen. Versuchen Sie nun das gleiche durch speichern wird die gesamte Liste als Zeichenfolge (zum Beispiel als serialisiertes JSON-Objekt, obwohl es sicher mehr komprimiert/Performance-Optionen). In meiner Erfahrung, für sehr große Listen (z.B. 50k-500k-Elemente) der homogenen Datentyp (z.B. ganze zahlen mit höchstens K-stellig), es war etwa ~1000-mal schneller speichern wird die gesamte Liste als string-Repräsentation einer timeseries und entpacken Sie es nach der Lektüre von Redis.
  • Sortierte Sätze sind O(log(N)+M) ein, und sind nicht Gegenstand der gleichen Zeit, die Komplexität von Listen; Sie sind weit effizienter. @Nisan.H ich bin nicht einverstanden mit Ihrem Vorschlag, das speichern einer ganzen Liste als string könnte arbeiten für kleine Listen, aber nicht skaliert bis zu sehr großen Listen, da es zwingt den client zum abrufen der gesamten Liste und packen Sie es vor dem ausführen beliebiger Operationen; dies ist keine effiziente Lösung. Die Verwendung von sortierten Sätzen skizziert, unten ist ein text-book-Lösung für die OP ' s Frage.
  • Ich Stimme zwar im Prinzip, es ist meine Erfahrung gewesen, dass Redis dauert etwa so lange zum Lesen von N Werten aus einer collection (list,set,sortiert, set,hashfield), wie es tut, zu Lesen, N regelmäßige Schlüssel:Wert-Paaren. Was nicht so lange ist Lesen eines einzelnen sehr großen Wert... Das ist sehr fallspezifisch und nur ein Problem, wenn Sie Ihre Sammlungen sind sehr groß UND Ihre lese-groß sind (viele Tausende von Werten, die pro Lesevorgang), aber es lohnt sich, bewusst.
Schreibe einen Kommentar