Beeinflusst die Namenslänge die Leistung in Redis?


129

Ich verwende zum Beispiel gerne ausführliche Namen in Redis set-allBooksBelongToUser:$userId.

Ist das in Ordnung oder wirkt sich das auf die Leistung aus?

Antworten:


198

Der Schlüssel, über den Sie sprechen, ist nicht wirklich so lang.

Der von Ihnen angegebene Beispielschlüssel gilt für eine Menge. Die Suchmethoden für Mengen sind O (1). Die komplexeren Operationen an einem Set (SDIFF, SUNION, SINTER) sind O (N). Es besteht die Möglichkeit, dass das Auffüllen $userIdteurer war als die Verwendung eines längeren Schlüssels.

Redis wird mit einem Benchmark-Dienstprogramm namens geliefert. redis-benchmarkWenn Sie den "GET" -Test in src / redis-Benchmark.c so ändern, dass der Schlüssel nur "foo" ist, können Sie den Kurzschlüsseltest nach einem der make installfolgenden Schritte ausführen :

diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
         benchmark("MSET (10 keys)",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"SET foo:rand:000000000000 %s",data);
+        len = redisFormatCommand(&cmd,"SET foo %s",data);
         benchmark("SET",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"GET foo:rand:000000000000");
+        len = redisFormatCommand(&cmd,"GET foo");
         benchmark("GET",cmd,len);
         free(cmd);

Hier ist die GET-Testgeschwindigkeit für 3 aufeinanderfolgende Läufe des Kurzschlüssels "foo":

59880.24 requests per second
58139.53 requests per second
58479.53 requests per second

Hier ist die GET-Testgeschwindigkeit, nachdem Sie die Quelle erneut geändert und den Schlüssel in "set-allBooksBelongToUser: 1234567890" geändert haben:

60240.96 requests per second
60606.06 requests per second
58479.53 requests per second

Ändern Sie den Schlüssel wieder auf „ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem: 1234567890“ gibt dies:

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second

Selbst wirklich sehr lange Tasten haben keinen großen Einfluss auf die Geschwindigkeit von Redis. Und dies ist bei GET eine O (1) -Operation. Komplexere Operationen wären dafür noch weniger empfindlich.

Ich denke, dass Schlüssel, die klar identifizieren, welche Werte sie enthalten, die winzige Geschwindigkeitsleistung, die Sie mit abgekürzten Schlüsseln erzielen würden, bei weitem überwiegen.

Wenn Sie dies weiter -r [keyspacelen]verfolgen möchten , gibt es im Redis-Benchmark-Dienstprogramm auch einen Parameter, mit dem zufällige Schlüssel erstellt werden können (sofern sie ': rand:' enthalten). Sie können einfach das Präfix in der Datei erhöhen Testen Sie den Code auf die gewünschte Länge.


5
Was ist mit dem Platzbedarf? Wenn ich 1 Million dieser wirklich langen Schlüssel habe, ist sie dann im Speicher so viel größer oder bleibt auf der Festplatte erhalten?
Derek Organ

9
@Derek Organ yep, es würde sich definitiv auf den belegten Speicher auswirken. Wenn Ihre Schlüssel also einen wesentlichen Teil dessen ausmachen, was Sie speichern, und Sie auf Speicherbeschränkungen stoßen, möchten Sie möglicherweise weniger ausführlich sein. Ich denke, Sie müssen die Benutzerfreundlichkeit mit Platzüberlegungen in Einklang bringen. Die Gesamtsuchzeit ist mit Schlüsseln nicht wesentlich länger, aber es würde Platz beansprucht.
Ted Naleid

Wir verwenden normalerweise die kürzest möglichen Schlüssellängen und verschieben die "Lesbarkeit" auf unsere Domänenobjekte und deren Methoden. Wir verwenden auch kurze Namespaces in unseren Schlüsseln, um die Wartung und Inspektion in Redis direkt zu unterstützen.
Xentek

26

Redis hält gerne alle Tasten im Speicher. Je länger Ihre durchschnittliche Schlüssellänge ist, desto weniger kann gespeichert werden. Ja, die Schlüssellänge kann die Leistung stark beeinflussen, aber wahrscheinlich nicht wesentlich für Sie. Das heißt, mit einem kleinen Schlüsselbereich (z. B. einem, der leicht in den Speicher passt) funktionieren ein 128-Byte-Schlüssel und ein 16-Byte-Schlüssel nicht dramatisch anders.


4
Redis ist per Definition ein All-in-Memory-Speicher, daher ist der erste Satz für mich verwirrend.
Lee Grissom

5
@bmatheny, wenn ich Ihre Abfrage richtig verstehe, ist Redis im Grunde ein In-Memory-Speicher, und es unterstützt auch die Persistenz
Najeeb

5

Ich kann diese Frage nicht mit Sicherheit beantworten. Ich kann jedoch einige Fragen dazu stellen und einige Beobachtungen machen.

Ich denke, es ist offensichtlich, dass extrem lange Schlüssel (Namen) und / oder Werte einen Einfluss auf die Gesamtleistung haben würden, wenn sie überhaupt verwendet werden können. Diese Auswirkungen können im Client, über das Netzwerk oder auf dem Server auftreten. Die erste Frage, die Sie herausziehen sollten, wäre also:

Wie lange können die Schlüssel und Werte zwischen Redis und Ihren Kunden liegen?

Durch die Suche nach Redis , Schlüssellänge und -limits erhalte ich einen interessanten Blogeintrag zu Redis vs. memcached, der möglicherweise Ihre Frage beantwortet. Die erste Antwort auf diesen Blogeintrag scheint von Salvatore Sanfilipo, dem Erfinder von Redis (Anfang letzten Herbst: 09/2010), verfasst worden zu sein, was darauf hindeutet, dass eine neuere Version deutlich bessere Ergebnisse zeigen würde. Zwei Kommentare von diesem Link führen uns zu Salvatores Redis / memcached Benchmark, der einige Tage nach seiner Antwort auf den ursprünglichen "Blagger" (der anonym zu sein scheint) veröffentlicht wurde.

Dies beantwortet die Fragen nicht (wie lang können die Schlüssel sein und an welchen Stellen sind erkennbare Auswirkungen auf die Leistung). Es gibt uns jedoch einen Hinweis auf die Herangehensweise an die Frage.

Die Autoren dieser beiden Artikel haben Code geschrieben und getestet ... und die Ergebnisse grafisch dargestellt.

Wir könnten alle möglichen Vermutungen anstellen. Wir könnten uns den Code ansehen und versuchen, ihn herauszufinden.

Der sinnvollste Weg, sich einer Frage dieser Art zu nähern, besteht darin, einen Code zu schreiben, um ein vorgeschlagenes Verwendungsmuster zu messen ... und einen weiteren, um ein anderes zu testen (zum Beispiel einen Bereich von Schlüssellängen zwischen 8 Zeichen und ... wie) lang möchten Sie ... 8 Kilobyte?) ... und das messen Sie es.


-7

Ich glaube nicht, dass die Länge des Variablennamens die Leistung beeinflusst. Die Variable wird dieselbe Stelle einnehmen wie jede Variable für diesen Datentyp, sofern Sie die maximale Namenslänge nicht überschreiten.


6
Charlie: Das sind keine wirklichen "Variablen", sondern Schlüssel. Bei Schlüsseln zwischen 1 und 30 oder 100 oder sogar 255 Zeichen sind möglicherweise keine Auswirkungen auf die Leistung erkennbar. Erstellen Sie Schlüssel mit einigen Kilobyte ... oder bis zu zehn Kilobyte, und ich kann mir vorstellen, dass Sie einen Leistungseinbruch messen können (irgendwann zwischen 1 KB und 70 KB werden Sie zusätzlichen Netzwerk-Overhead haben, da die Schlüsselgröße dies zulässt Überschreiten Sie Ihre MTU, und die Daten müssen über mehrere Pakete verteilt werden.
Jim Dennis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.