Redis Speicheroptimierung

8

Ich versuche, einige Daten (eine sehr große Saite) sehr speicherfreundlich auf der Redis-Seite zu kodieren. Gemäß den Redis-Dokumenten wird behauptet, dass "Hashes verwenden, wenn möglich" verwendet wird, und es gibt zwei Konfigurationsparameter an:

  • Die "hash-max-zipmap-entries", die, wenn ich es gut verstehe, angeben, wie viele Schlüssel höchstens jeder Hash-Schlüssel haben muss (habe ich recht?).

  • Der "hash-max-zipmap-Wert", der die maximale Länge für den Wert angibt. Bezieht es sich eigentlich auf das Feld oder auf den Wert? Und die Länge ist in Bytes, Zeichen oder was?

Mein Gedanke ist, die Saite (die irgendwie feste Länge hat) in solche Quantitäten aufzuspalten, die gut mit den obigen Parametern spielen und sie als Werte speichern. Die Felder sollten nur Sequenznummern sein, um eine konsistente Dekodierung zu gewährleisten.

BEARBEITEN : Ich habe umfangreiche Tests durchgeführt und es scheint, dass das Codieren der Zeichenfolge in einem Hash einen um 50% besseren Speicherverbrauch ergibt.

Hier ist mein Benchmarking-Skript:

%Vor%

und die Ergebnisse auf meinem Rechner (32bit Redis-Instanz):

%Vor%

Ich frage, ob es eine effizientere Möglichkeit gibt, die Zeichenfolge als Hash zu speichern, indem ich mit den genannten Parametern spiele. Also zuerst, ich muss mir bewusst sein, was sie bedeuten .. Dann werde ich wieder Benchmark und sehen, ob es mehr Gewinn ist ..

EDIT2: Bin ich ein Idiot? Das Benchmarking ist korrekt, aber es wird für eine große Zeichenfolge bestätigt. Wenn ich für viele große Saiten wiederhole, ist das Speichern als große Saiten der definitive Gewinner. Ich denke, dass der Grund, warum ich diese Ergebnisse für eine Saite bekommen habe, in den Redis Interna liegt.

    
hymloth 18.09.2011, 22:25
quelle

3 Antworten

6

Tatsächlich ist die effizienteste Möglichkeit, eine große Zeichenfolge zu speichern, eine große Zeichenfolge - alles andere verursacht zusätzlichen Aufwand. Die Optimierungen, die Sie erwähnen, sind für den Umgang mit vielen kurzen Strings gedacht, wobei ein leerer Platz zwischen den Strings ein Problem werden kann.

Die Leistung beim Speichern einer großen Zeichenfolge ist möglicherweise nicht so gut wie bei kleinen Zeichenfolgen, da mehr zusammenhängende Blöcke zum Speichern dieser Zeichenfolge benötigt werden, aber das hat kaum Auswirkungen auf irgendetwas.

    
Tom Clarkson 19.09.2011, 13:59
quelle
4

Ich habe versucht, die Redis-Dokumente über die von Ihnen erwähnten Einstellungen zu lesen, und es ist nicht einfach. Aber es hört sich für mich nicht so an, als wäre dein Plan eine gute Idee. Das Hashing, das sie beschreiben, soll Speicher für kleine Werte speichern. Die Werte sind noch vollständig im Speicher gespeichert. Es klingt für mich so, als würden sie den Overhead reduzieren, wenn sie oft auftauchen, zum Beispiel wenn zu vielen Sets ein String hinzugefügt wird. Ihre Zeichenfolge erfüllt diese Kriterien nicht. Ich bezweifle stark, dass du mit deinem Schema Speicher sparen wirst.

Sie können es natürlich vergleichen, um zu sehen.

    
Ned Batchelder 19.09.2011 02:34
quelle
1

Versuchen Sie, Redis Memory Usage Artikel zu sehen, wo Sie einen guten Vergleich von verschiedenen finden können Datentypen und deren Speicherverbrauch.

    
yojimbo87 19.09.2011 07:15
quelle

Tags und Links