Redis
 sql >> Base de données >  >> NoSQL >> Redis

Un moyen efficace de mémoire pour stocker un entier signé 32 bits dans Redis

En interne, Redis stocke les chaînes de la manière la plus efficace. Forcer des entiers dans des chaînes de base 10 utilisera en fait plus de mémoire.

Voici comment Redis stocke les chaînes -

  1. Les nombres entiers inférieurs à 10 000 sont stockés dans un pool de mémoire partagée et n'ont pas de surcharge de mémoire. Si vous le souhaitez, vous pouvez augmenter cette limite en modifiant la constante REDIS_SHARED_INTEGERS dans redis.h et en recompilant Redis.
  2. Les nombres entiers supérieurs à 10 000 et compris dans la plage d'un long consomment 8 octets.
  3. Les chaînes régulières prennent len(chaîne) + 4 octets pour la longueur + 4 octets pour marquer l'espace libre + 1 octet pour le terminateur nul + 8 octets pour les surcharges malloc.

Dans l'exemple que vous avez cité, c'est une question de 8 octets pour un long v/s 21 octets pour la chaîne.

MODIFIER :

Donc, si j'ai un ensemble de nombres tous inférieurs à 10 000, comment Redis stocke-t-il mon ensemble ?

Cela dépend du nombre d'éléments dont vous disposez.

Si vous avez moins de 512 éléments dans votre ensemble (voir set-max-intset-entries ), alors l'ensemble sera stocké en tant qu'IntSet. Un IntSet est un nom glorifié pour un tableau d'entiers triés. Puisque vos nombres sont inférieurs à 10000, il utiliserait 16 bits par élément. Il est (presque) aussi économe en mémoire qu'un tableau C.

Si vous avez plus de 512 éléments, l'ensemble devient un HashTable. Chaque élément de l'ensemble est enveloppé dans une structure appelée robj , qui a une surcharge de 16 octets. Le robj structure a un pointeur vers le pool partagé d'entiers, vous ne payez donc rien de plus pour l'entier lui-même. Et enfin, le robj les instances sont stockées dans la table de hachage, et la table de hachage a une surcharge proportionnelle à la taille de l'ensemble.

Si vous êtes intéressé par la quantité exacte de mémoire consommée par un élément, exécutez redis-rdb-tools sur votre ensemble de données (avertissement :je suis l'auteur de cet outil). Ou vous pouvez lire le code source de la classe MemoryCallback, les commentaires expliquent comment la mémoire est disposée.