Speichersparende Methode zum Speichern von 32-Bit-Ganzzahlen mit Vorzeichen in Redis

8

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%     
Aresn 22.04.2013, 00:59
quelle

2 Antworten

17

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 -

  1. Integer mit weniger als 10000 werden in einem gemeinsam genutzten Speicherpool gespeichert und haben keinen Speicheraufwand. Wenn Sie möchten, können Sie dieses Limit erhöhen, indem Sie die Konstante REDIS_SHARED_INTEGERS in redis.h und Redis neu kompilieren.
  2. Integer größer als 10000 und innerhalb eines Bereichs von 8 Bytes.
  3. Regelmäßige Strings nehmen len (string) + 4 Bytes für die Länge + 4 Bytes für die Markierung des freien Speicherplatzes + 1 Byte für den Null-Terminator + 8 Bytes für die malloc-Overheads an.

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.

    
Sripathi Krishnan 22.04.2013, 04:17
quelle
1

Strings werden mit einer Länge gespeichert, also sind es nicht nur 4 Bytes in der Datenbank - es ist wahrscheinlich als 4 Bytes Daten + 4 Bytes Länge + Padding gespeichert, so dass Sie nichts gewinnen.

    
rmmh 22.04.2013 01:05
quelle

Tags und Links