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

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

Intern speichert Redis Strings auf die effizienteste Weise. Das Erzwingen von Ganzzahlen in Radix-10-Strings verbraucht tatsächlich mehr Speicher.

So speichert Redis Strings -

  1. Ganzzahlen kleiner 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 ändern und Redis neu kompilieren.
  2. Ganzzahlen größer als 10000 und innerhalb des Bereichs von Long verbrauchen 8 Bytes.
  3. Reguläre Strings nehmen len(string) + 4 Bytes für die Länge + 4 Bytes zum Markieren von freiem Speicherplatz + 1 Byte für das Null-Terminator + 8 Bytes für Malloc-Overheads.

In dem von Ihnen zitierten Beispiel handelt es sich um eine Frage von 8 Bytes für eine lange vs. 21 Bytes für die Zeichenfolge.

BEARBEITEN:

Wenn ich also einen Satz von Zahlen habe, die alle kleiner als 10.000 sind, wie speichert Redis meinen Satz?

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 ), dann wird der Satz als IntSet gespeichert. Ein IntSet ist ein verherrlichter Name für ein Sorted Integer Array. Da Ihre Zahlen kleiner als 10000 sind, würde es 16 Bit pro Element verwenden. Es ist (fast) so speichereffizient wie ein C-Array.

Wenn Sie mehr als 512 Elemente haben, wird der Satz zu einer HashTable. Jedes Element in der Menge ist in eine Struktur namens robj eingeschlossen , die einen Overhead von 16 Byte hat. Der robj Die Struktur hat einen Zeiger auf den gemeinsam genutzten Pool von Ganzzahlen, sodass Sie für die Ganzzahl selbst nichts extra bezahlen. Und schließlich der robj Instanzen werden in der Hashtabelle gespeichert, und die Hashtabelle hat einen Overhead, der proportional zur Größe des Satzes ist.

Wenn Sie genau wissen möchten, wie viel Speicher ein Element verbraucht, führen Sie redis-rdb-tools auf Ihrem Datensatz aus (Haftungsausschluss:Ich bin der Autor dieses Tools). Oder Sie können den Quellcode für die Klasse MemoryCallback lesen, die Kommentare erklären, wie der Speicher ausgelegt ist.