2015-05-06 9 views
7

Was ich tun muss, ist ein One-to-One-Mapping zu speichern. Der Datensatz besteht aus einer großen Anzahl von Schlüssel/Wert-Paaren derselben Art (10M +). Zum Beispiel könnte man eine einzelne Instanz eines HashMap-Objekts in Java zum Speichern solcher Daten verwenden.Redis - der beste Weg, um eine große Karte (Wörterbuch) zu speichern

Der erste Weg, dies zu tun, ist eine Menge Schlüssel-Wert-Paare zu speichern, wie folgt aus:

SET map:key1 value1 
... 
SET map:key900000 value900000 
GET map:key1 

Die zweite Option ist ein einziges "Hash" zu verwenden:

HSET map key1 value 
... 
HSET map key900000 value900000 
HGET map key1 

Redis Hashes haben einige bequeme Befehle (HMSET, HMGET, HGETALL, usw.), und sie verschmutzen den Schlüsselraum nicht, also sieht das wie eine bessere Option aus. Gibt es jedoch Überlegungen zur Leistung oder zum Speicher bei der Verwendung dieses Ansatzes?

+2

Dies ist eigentlich eine empfohlene Verwendung Muster etwas RAM mit Redis speichern - http://redis.io/topics/memory-optimization#using-hashes-to-abstract-a-very-memory -efficient-plain-key-value-speichern-auf-top-of-redisere –

Antwort

9

Ja, wie Itamar Haber sagt, dass Sie redis memory optimization guide betrachten sollten. Aber auch solche Dinge sollten Sie beachten (in wenigen Zeilen):

  1. HSET bevorzugt neben KEYS. Redis verbraucht viel Speicher nur bei der Verwaltung von Schlüsselbereichen. Im einfachen (und ungefähren) 1 HSET mit 1.000.000 Schlüsseln verbrauchen Sie bis zu 10x weniger Speicher als 1.000.000 Schlüssel mit einem Wert.
  2. Halten HSET-Größe weniger als hash-max-zipmap-entries und gültige hash-max-zipmap-value, wenn Speicher Hauptziel ist. Achten Sie darauf zu verstehen, was hash-max-zipmap-entries und hash-max-zipmap-value bedeutet. Nehmen Sie sich auch etwas Zeit, um über ziplist zu lesen.
  3. Während Sie tatsächlich nicht mit hash-max-zipmap-entries mit 10M + Tasten umgehen (langsamer Zugriff in diesem Schlüssel) sollten Sie ein HSET in einigen Steckplätzen brechen. Zum Beispiel setzen Sie hash-max-zipmap-entries als 10.000. Um also 10M + Schlüssel zu speichern, benötigen Sie 1000+ HSET-Schlüssel mit je 10.000. Für ein grobes Beispiel - crc32 (key)% maxHsets.
  4. Lesen Sie über strings in redis und verwenden Sie KEY-Namen (in HSET) Länge basierend auf realen Speicherverwaltung für diese Struktur. In einer einfachen Schlüssellänge von weniger als 7 Bytes geben Sie 16 Bytes pro Schlüssel aus, aber 8 Bytes Schlüssel verbrauchen jeweils 48 Bytes. Warum? Lesen Sie über simple dynamic strings.

Es kann sehr nützlich sein, um zu lesen:

+0

Große Antwort, gut gemacht. –

+0

Ich schätze diese Informationen. – NappingRabbit

+0

Sehen Sie sich die Grafiken unter https://www.peterbe.com/plog/understanding-redis-hash-max-ziplist-entries an, in denen der Gesamtspeicherbedarf der Datenbank mit verschiedenen Speichermethoden verglichen wird. –

Verwandte Themen