Da Redis versucht, Strings auf 64-Bit-Ganzzahlen mit Vorzeichen zu analysieren, ist es eine gute Idee, eine binäre Darstellung einer 32-Bit-Ganzzahl mit Vorzeichen anstelle von 10-Ganzzahl-Strings zu speichern?
In unserem System haben wir Listen vieler 32 Bit signierter Integer-IDs.
%Vor%Intern speichert Redis Strings am effizientesten. Wenn ganze Zahlen in Radix 10-Strings umgewandelt werden, wird tatsächlich mehr Speicher verbraucht.
So speichert Redis Strings -
In dem von Ihnen zitierten Beispiel handelt es sich um eine Frage von 8 Bytes für eine lange v / s 21 Bytes für die Zeichenfolge.
BEARBEITEN:
Also, wenn ich eine Reihe von Zahlen alle weniger als 10.000 habe, wie speichert Redis mein Set?
Es hängt davon ab, wie viele Elemente Sie haben.
Wenn Sie weniger als 512 Elemente in Ihrem Set haben (siehe set-max-intset-entries
), wird das Set als IntSet gespeichert. Ein IntSet ist ein verklärter Name für ein Sorted Integer Array. Da Ihre Zahlen weniger als 10000 sind, würde es 16 Bits pro Element verwenden. Es ist (fast) so speichereffizient wie ein C-Array.
Wenn Sie mehr als 512 Elemente haben, wird das Set zu einer HashTable. Jedes Element in der Gruppe ist in eine Struktur namens robj
eingeschlossen, die einen Overhead von 16 Bytes aufweist. Die robj
-Struktur hat einen Zeiger auf den gemeinsam genutzten Pool von Ganzzahlen, sodass Sie für die Ganzzahl selbst nichts extra bezahlen müssen. Und schließlich werden die robj
Instanzen in der Hashtabelle gespeichert, und die Hashtabelle hat einen Overhead, der proportional zur Größe der Menge ist.
Wenn Sie genau wissen möchten, wie viel Speicher ein Element verbraucht, führen Sie redisrdb-tools auf Ihrem Computer aus Datensatz. Oder Sie können den Quellcode für die Klasse MemoryCallback lesen Kommentare erklären, wie die Erinnerung angelegt ist.
Tags und Links redis