2012-11-06 7 views
12

Eigentlich habe ich 3 Redis-Instanzen und ich habe sie in diese 500 MB + dump.rdb. Der Redis-Server kann dieses dump.rdb lesen und es scheint, dass alles in Ordnung ist. Dann merke ich, dass redis-Server mehr als 5.0GB Speicher kostet. Ich weiß nicht warum.Warum benötigt eine 500 MB Redis dump.rdb-Datei etwa 5,0 GB Arbeitsspeicher?

Ist irgendetwas mit meiner Datei falsch? Mein db hat ungefähr 3 Millionen Schlüssel, Werte für jeden Schlüssel ist eine Liste enthält ungefähr 80 ganze Zahlen.

Ich benutze diese METHOD, um 3 Instanzen zusammen zu setzen.

PS: Ein weiterer dump.rdb mit der gleichen Größe und der gleichen Schlüssel-Wert-Struktur kostet nur 1 GB Speicher.

Und meine Daten sieht wie KeyNum -> {Num1, Num2, Num3, ......}. Alle Zahlen liegen zwischen 1 und 4.000.000. Also sollte ich List verwenden, um sie zu speichern? Fürs Erste benutze ich lpush (k, v). Hat dieser Weg zu viel gekostet?

Antwort

0

Es kann mehr sein, aber ich glaube, Redis komprimiert die Dump-Dateien.

+0

Ja, es komprimiert die Daten. 500MB bis 5.0GB, ich kann mein Programm jetzt nicht starten :-( – wyp

15

Das Verhältnis von Arbeitsspeicher zu Abbildgröße hängt von den Datentypen ab, die Redis intern verwendet.

Für kleine Objekte (Hashes, Listen und Sortedsets) verwendet redis Zip-Listen, um Daten zu codieren. Bei kleinen Mengen aus Ganzzahlen verwendet redis Intsets. ZipLists und IntSets werden auf dem Datenträger im selben Format gespeichert, in dem sie im Speicher gespeichert sind. Sie würden also ein Verhältnis von 1: 1 erwarten, wenn Ihre Daten diese Kodierungen verwenden.

Bei größeren Objekten unterscheidet sich die In-Memory-Darstellung vollständig von der Darstellung auf der Festplatte. Das Format auf der Festplatte ist komprimiert, hat keine Zeiger, muss sich nicht mit der Speicherfragmentierung befassen. Wenn also Ihre Objekte groß sind, ist ein Verhältnis von 10: 1 von Arbeitsspeicher zu Datenträger normal und wird erwartet.

Wenn Sie wissen möchten, welche Objekte Speicherplatz verbrauchen, verwenden Sie redis-rdb-tools, um Ihre Daten zu profilieren. Von dort folgen Sie der memory optimization notes on redis.io, sowie der memory optimization wiki entry on redis-rdb-tools.

Verwandte Themen