2016-09-11 3 views
0

Ich habe rund 256 Schlüssel. Gegen jeden Schlüssel muss ich eine große Anzahl nicht republikanischer Zahlen speichern. Im Folgenden sind die obersten 7 Schlüssel mit der Anzahl der Gesamtwerte (Einträge) für jede Taste. Jeder Wert ist eine eindeutige Ganzzahl mit großem Wert.Redis: Speicheroptimierung

Key  No. of integers (values) in the list 
Key 1 3394967 
Key 2 3385081 
Key 3 2172866 
Key 4 2171779 
Key 5 1776702 
Key 6 1772936 
Key 7 1748858 

Standardmäßig verbraucht Redis beim Speichern dieser Daten viel Speicher. Ich habe gelesen, dass das Ändern der folgenden Parameter zu einer stark reduzierten Speichernutzung führen kann.

list-max-zipmap-entries 512 
list-max-zipmap-value 64 

Kann jemand mir bitte erklären, diese über Konfigurationsbefehle (512 und 64 Bytes?) Und welche Veränderungen ich kann in den oben genannten Konfigurationseinstellungen für meinen Fall machen, um die Speicherauslastung Reduktion zu erreichen?

Was im Auge behalten werden sollte, während die Werte für Einträge Auswahl und Wert in obigem Befehl?

+0

Sind das Listen? Oder Sets? –

+0

@KarthikeyanGopall Ich speichere Werte in Listen für jeden Schlüssel, aber ich denke, dass Set für meinen Fall viel geeigneter sein wird. – Xara

+0

@RyanVincent Die obersten 7 Schlüssel in meiner Frage beziehen sich auf die Anzahl der ganzen Zahlen pro Schlüssel. – Xara

Antwort

1

list-max-Mipmap-Einträge 512: list-max-zipmap-Wert 64

Wenn die Anzahl der Einträge in einer Liste überschreitet 512, oder, wenn die Größe von einem bestimmten Elemente in der Liste> 64 In Bytes wird Redis auf eine weniger effiziente In-Memory-Speicherstruktur umschalten. Genauer gesagt wird unterhalb dieser Schwellenwerte eine Zip-Liste verwendet, und darüber wird eine verknüpfte Liste verwendet.

In Ihrem Fall müssten Sie also einen Eintragswert von> 1748858 verwenden, um Änderungen anzuzeigen (und dann nur in den Schlüsseln 8-Ende). Beachten Sie auch, dass Redis, um sie auf die kleinere Objektgröße neu zu codieren, auch die Änderung in der Konfiguration vornehmen und Redis neu starten muss, da sie nicht automatisch neu codiert wird.

Verwenden Sie den Befehl OBJECT, um zu überprüfen, ob ein bestimmter Schlüssel eine Ziplist oder eine verknüpfte Liste verwendet.

Weitere Einzelheiten finden Sie Redis Memory Optimization

1

IMO können Sie nicht redis' Speicheroptimierung erzielen. In Ihrem Fall sind die Einträge in jeder Liste/Menge etwa 3 Millionen. Um Speicheroptimierung zu erreichen, wenn Sie den Wert von list-max-zipmap-Einträge als 3 Millionen angeben.

Redis doc sagt,

Dieser Vorgang ist sehr schnell für kleine Werte, aber wenn Sie die Einstellung zu verwenden, um speziell codierte Werte für viel größere Aggregattypen der Vorschlag ist, ändern einige Benchmark laufen und testen Sie überprüfen Sie die Konvertierungszeit.

Nach dieser Codierung und Decodierung dauert mehr Zeit/CPU für diese große Zahl. Daher ist es besser, einen Benchmark-Test durchzuführen und dann zu entscheiden.

Ein alternativer Vorschlag, wenn Sie nur nachsehen, ob ein Schlüssel verfügbar ist oder nicht. dann können Sie die Struktur in einen Eimer Art einer Sache ändern.

Zum Beispiel 123456 ein Wert Schlüssel1 einstellen wie diese

Sadd key1:bucket:123 456 

123 = 123456/1000 456 = 123456% 1000

Hinweis Diese Arbeit wird nicht gespeichert, wenn Sie abrufen möchten alle Werte für key1. In diesem Fall würden Sie 1000 Sets durchgehen. ähnlich für die Gesamtgröße von Schlüssel1 müssen Sie 1000 Schlüssel durchlaufen.

Aber der Speicher wird auf etwa 10 reduziert werden.

Verwandte Themen