Ceci est lié à la version Redis. En regardant le fichier object.c de redis-3.0 et la dernière version, vous pouvez constater que lors de la création de StringObject, il sera comparé à REIDS_ENCODING_EMBSTR_SIZE_LIMIT. La valeur par défaut est 39. En regardant le code source de la version redis-2.8, je n'ai trouvé aucune comparaison, mais je l'ai créé directement. Je suppose donc que cet encodage embstr n'est apparu que dans la version 3.0 ou supérieure.
Quant à pourquoi il fait 39, c'est plus compliqué à expliquer, donc je vais l'expliquer lentement. embstr est une zone de mémoire continue composée de redisObject et sdshdr. Parmi eux, redisObject occupe 16 octets. Lorsque la longueur de la chaîne dans buf est de 39, la taille de sdshdr est de 8+39+1=48, quel octet est '.
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
À partir de la version 2.4, redis commence à utiliser l'allocateur de mémoire jemalloc. C'est bien mieux que le malloc de la glibc et économise de la mémoire. On peut simplement comprendre ici que jemalloc allouera 8, 16, 32, 64 octets de mémoire. L'embstr minimum est de 16+8+8+1=33, donc l'allocation minimale est de 64 octets. Lorsque le nombre de caractères est inférieur à 39, 64 octets sont alloués.
Ceci est lié à la version Redis.
En regardant le fichier object.c de redis-3.0 et la dernière version, vous pouvez constater que lors de la création de StringObject, il sera comparé à REIDS_ENCODING_EMBSTR_SIZE_LIMIT. La valeur par défaut est 39.
En regardant le code source de la version redis-2.8, je n'ai trouvé aucune comparaison, mais je l'ai créé directement.
Je suppose donc que cet encodage embstr n'est apparu que dans la version 3.0 ou supérieure.
Quant à pourquoi il fait 39, c'est plus compliqué à expliquer, donc je vais l'expliquer lentement.
À partir de la version 2.4, redis commence à utiliser l'allocateur de mémoire jemalloc. C'est bien mieux que le malloc de la glibc et économise de la mémoire. On peut simplement comprendre ici que jemalloc allouera 8, 16, 32, 64 octets de mémoire. L'embstr minimum est de 16+8+8+1=33, donc l'allocation minimale est de 64 octets. Lorsque le nombre de caractères est inférieur à 39, 64 octets sont alloués.embstr est une zone de mémoire continue composée de redisObject et sdshdr. Parmi eux, redisObject occupe 16 octets. Lorsque la longueur de la chaîne dans buf est de 39, la taille de sdshdr est de 8+39+1=48, quel octet est '.
C'est de là que vient la valeur par défaut de 39.