Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Wie fügt man Milliarden von Daten effizient in Redis ein?

Ein paar Punkte zur Frage und Beispielcode.

  1. Pipelining ist keine Wunderwaffe – Sie müssen verstehen, was es tut, bevor Sie es verwenden. Beim Pipelining werden mehrere Vorgänge gestapelt, die als Massen gesendet werden, ebenso wie ihre Antwort vom Server. Was Sie gewinnen, ist, dass die Netzwerkumlaufzeit für jeden Vorgang durch die des Stapels ersetzt wird. Aber unendlich große Chargen sind eine echte Belastung für Ressourcen – Sie müssen ihre Größe klein genug halten, um effektiv zu sein. Als Faustregel versuche ich normalerweise, 60 KB pro Pipeline anzustreben, und da alle Daten unterschiedlich sind, gilt dies auch für die Anzahl der tatsächlichen Operationen in einer Pipeline. Angenommen, Ihr Schlüssel und sein Wert sind ~1 KB, müssen Sie pipeline.execute() aufrufen alle 60 Operationen oder so.

  2. Wenn ich es nicht grob falsch verstehe, sollte dieser Code nicht ausgeführt werden. Sie verwenden HMSET als ob es SET wäre , also fehlt Ihnen im Grunde die Feld->Wert-Zuordnung von Hashes. Hashes (HMSET ) und Strings (SET ) sind unterschiedliche Datentypen und sollten daher entsprechend verwendet werden.

  3. Es scheint, als ob diese eine kleine Schleife für die gesamte "Milliarde von Daten" verantwortlich ist - wenn das der Fall ist, würde Ihr Server, auf dem der Code läuft, nicht nur wie verrückt tauschen, es sei denn, er hat viel RAM, um das Wörterbuch zu speichern, es wäre auch sehr ineffektiv (unabhängig von der Geschwindigkeit von Python). Sie müssen die Dateneinfügung parallelisieren, indem Sie mehrere Instanzen dieses Prozesses ausführen.

  4. Verbindest du dich remote mit Redis? In diesem Fall schränkt das Netzwerk möglicherweise Ihre Leistung ein.

  5. Berücksichtigen Sie die Einstellungen Ihres Redis - vielleicht können diese für eine bessere Leistung für diese Aufgabe optimiert/abgestimmt werden, vorausgesetzt, es handelt sich tatsächlich um einen Engpass.