2017-01-22 1 views
0

Nous utilisons le noeud Elasticache Redis pour stocker les données.Comment les paires clé/valeur sont stockées dans Redis

Toutes les clés ont le même format:
- La clé est un hachage md5 - 128 bits (16 octets, 32 caractères caractères octets).
- La valeur est une chaîne d'horodatage - 19 octets.
Au total, la taille clé est 32+19=51 bytes

Nous avons 84 917 361 millions de clés. Je suppose que la mémoire totale utilisée par l'interpréteur Redis est proche de 84917361*51 = 4.03 gb. En réalité, cela prend 11.07 gb.
Sortie de info commande: used_memory_human:11.07G

  1. sur ce qui est passé reste de la mémoire, 7 gb?
  2. Y at-il un moyen de stocker md5 comme hachage de 16 octets, pas de chaîne avec 32 caractères?

Merci, toute aide est très appréciée.

+0

Vous pourriez être intéressé par [cet article] (https://redis.io/topics/memory-optimization), en particulier la partie sur l'impact de la mémoire des clés par rapport aux hachages. –

+0

Merci @Kevin Christopher Henry, je vais mettre en œuvre des suggestions. – antonbormotov

Répondre

1

Sur quoi reste-t-il le reste de la mémoire, 7 Go?

Réponse courte: Redis ne stocke pas la clé et de la valeur en tant que chaîne brute.

En fait,

  1. la clé est enveloppée dans une structure sdshdr (pour la dernière version, il est une structure plus compacte), qui a certains frais généraux, par exemple la longueur de la chaîne.

  2. la valeur est enveloppée dans une structure redisObject, qui a également une certaine surcharge, par ex. encodage d'objet, refcount.

  3. Il y a également d'autres préfixes lorsque Redis insère une paire dans un dict, par ex. le pointeur next et le pointeur key dans une structure dictEntry.

Tous ces frais généraux consomment le reste de la mémoire.

Afin de rendre c'est plus efficace de la mémoire, vous pouvez vous référer à l'article que Christopher Henry mentionné @ Kevin (petit hachage peut économiser beaucoup d'redisObject frais généraux, et peut utiliser ziplist pour rendre les éléments plus compact en mémoire).

Existe-t-il un moyen de stocker md5 comme un hachage de 16 octets, pas une chaîne de 32 caractères?

utiliser une fonction de hachage, tel que Murmurhash, pour créer un résumé pour chaque chaîne md5.De cette manière, vous pouvez obtenir un résumé de 8 octets (64 bits). Toutefois, vous ne pouvez pas obtenir la chaîne md5 brute à partir du résumé Murmurhash. Donc, si vous faites pas la valeur de md5, vous pouvez prendre cette méthode.

+0

Merci @for_stack, c'est ce que je cherchais. Je vais essayer d'utiliser 'Murmurhash' ou' crc32' comme valeur de hachage. – antonbormotov