139 votes

La longueur des noms a-t-elle un impact sur les performances de Redis ?

J'aime utiliser des noms verbeux dans Redis, par exemple set-allBooksBelongToUser:$userId .

Est-ce que cela est correct ou est-ce que cela a un impact sur les performances ?

212voto

Ted Naleid Points 13349

La clé que vous voulez utiliser n'est pas si longue que ça.

L'exemple de clé que vous donnez est pour un ensemble, les méthodes de recherche d'ensemble sont O(1). Les opérations plus complexes sur un ensemble (SDIFF, SUNION, SINTER) sont O(N). Il y a de fortes chances que le remplissage de $userId était une opération plus coûteuse que l'utilisation d'une clé plus longue.

Redis est livré avec un utilitaire de référence appelé redis-benchmark Si vous modifiez le test "GET" dans src/redis-benchmark.c de manière à ce que la clé soit simplement "foo", vous pouvez exécuter le test de la clé courte après un make install :

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);

Voici la vitesse du test GET pour 3 exécutions successives de la touche courte "foo" :

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

Voici la vitesse du test GET après avoir modifié à nouveau la source et changé la clé en "set-allBooksBelongToUser:1234567890" :

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

En changeant encore une fois la clé en "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem : 1234567890" donne ceci :

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

Ainsi, même les clés vraiment très longues n'ont pas un grand impact sur la vitesse de redis. Et ceci est sur GET, une opération O(1). Des opérations plus complexes seraient encore moins sensibles à cela.

Je pense que le fait d'avoir des touches qui identifient clairement les valeurs qu'elles contiennent l'emporte largement sur les minuscules gains de vitesse que vous obtiendriez avec des touches abrégées.

Si vous voulez aller plus loin, il y a aussi un -r [keyspacelen] sur l'utilitaire redis-benchmark qui lui permet de créer des clés aléatoires (tant qu'elles contiennent ':rand:'), vous pouvez simplement augmenter la taille du préfixe dans le code de test à la longueur que vous voulez.

7 votes

Qu'en est-il de l'espace occupé ? Si j'ai un million de ces clés très longues, seront-elles plus volumineuses en mémoire ou sur le disque ?

10 votes

@Derek Organ yep, cela aurait certainement un impact sur la mémoire utilisée, donc si vos clés sont une partie significative de ce que vous stockez et que vous rencontrez des limitations de mémoire, vous pourriez vouloir être moins verbeux. Je pense que vous devez trouver un équilibre entre la facilité d'utilisation et les considérations d'espace. Le temps de recherche global n'est pas significativement plus long avec les clés, mais l'espace occupé le serait.

0 votes

Nous utilisons généralement les longueurs de clé les plus courtes possibles et déplaçons la "lisibilité" vers nos objets de domaine et leurs méthodes. Nous utilisons également des espaces de noms courts dans nos clés pour faciliter la maintenance et l'inspection dans redis directement.

30voto

bmatheny Points 1483

Redis aime garder toutes les clés en mémoire. Plus la longueur moyenne de votre clé est longue, moins elle peut être conservée en mémoire. Donc oui, la longueur de la clé peut avoir un impact important sur les performances, mais probablement pas de manière significative dans le sens où vous êtes concerné. En d'autres termes, avec un petit espace de clés (par exemple, un espace qui tient facilement en mémoire), une clé de 128 octets et une clé de 16 octets n'auront pas des performances très différentes.

7 votes

Redis est par définition un magasin tout-en-mémoire, la première phrase me laisse donc perplexe.

8 votes

@bmatheny, si je comprends bien votre question, Redis est fondamentalement un magasin en mémoire, et il supporte également la persistance.

5voto

Jim Dennis Points 5454

Je ne peux pas répondre à cette question avec certitude. Cependant, je peux poser quelques questions à ce sujet et proposer quelques observations.

Je pense qu'il est évident que des clés (noms) et/ou des valeurs extrêmement longues auraient un impact sur les performances globales, si tant est qu'elles puissent être utilisées. Ces impacts pourraient être dans le client, sur le réseau, ou sur le serveur. La première question à vous poser serait donc la suivante :

Quelle peut être la durée des clés et des valeurs entre Redis et vos clients ?

Recherche sur Redis , longueur des clés y limites me permet de trouver un article de blog intéressant sur Redis contre memcached ce qui peut commencer à répondre à votre question. La première réponse à cet article de blog semble avoir été écrite par Salvatore Sanfilipo, créateur de Redis (au début de l'automne dernier : 09/2010), suggérant qu'une version plus récente donnerait de bien meilleurs résultats. Deux commentaires plus bas de ce lien nous amènent à l'article de Salvatore. Benchmark Redis/memcached qui a été posté quelques jours après qu'il ait répondu au "blagger" original (qui semble être anonyme).

Cela ne répond pas aux questions (combien de temps peuvent durer les clés et à partir de quel moment il y a des impacts détectables sur les performances). Cependant, il nous donne un indice pour aborder la question.

Les auteurs de ces deux articles ont écrit du code et l'ont testé ... et ont tracé les résultats.

On pourrait faire toutes sortes de suppositions. Nous pourrions regarder le code et essayer de le raisonner.

Cependant, la manière la plus significative d'aborder une question de ce genre est d'écrire un peu de code pour mesurer un modèle d'utilisation proposé ... et un peu plus pour en tester un autre (par exemple une gamme de longueurs de clé allant de 8 caractères à ... quelle longueur voulez-vous ... 8 kilo-octets ?) ... et de les mesurer.

-7voto

Je ne pense pas que la longueur du nom de la variable affectera les performances, la variable prendra la même place que n'importe quelle variable pour ce type de données, tant que vous ne dépassez pas la longueur maximale du nom.

8 votes

Charlie : ce ne sont pas vraiment des "variables", ce sont des clés. Pour des clés comprises entre 1 et 30 ou 100, voire 255 caractères, il se peut qu'il n'y ait pas d'impact détectable sur les performances. Créez des clés de quelques kilo-octets ... ou jusqu'à des dizaines de kilo-octets et j'imagine que vous serez en mesure de mesurer un impact sur les performances (à un moment donné, entre 1K et 70K, vous serez confronté à une surcharge réseau supplémentaire puisque la taille de la clé dépassera votre MTU et que les données devront être réparties sur plusieurs paquets ... entraînant au minimum une surcharge TCP et de réassemblage).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X