Maison  >  Questions et réponses  >  le corps du texte

数据结构 - 关于 Redis 字符串小于 39 字节的疑惑

REDIS_ENCODING_EMBSTR_SIZE_LIMIT set to 39.

比如:

redis 127.0.0.1:2050> set massage "hello_world"
OK
redis 127.0.0.1:2050> object encoding massage
"raw"

为什么这段字符串小于 39 编码却是 raw?另外,小于 39 字节 embstr 编码,大于 39 raw 编码的缘由是什么?

PHP中文网PHP中文网2759 Il y a quelques jours703

répondre à tous(1)je répondrai

  • ringa_lee

    ringa_lee2017-04-22 08:58:25

    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.

    C'est de là que vient la valeur par défaut de 39.

    répondre
    0
  • Annulerrépondre