数据结构 - 关于 Redis 字符串小于 39 字节的疑惑
PHP中文网
PHP中文网 2017-04-22 08:56:25
0
1
705
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中文网

认证0级讲师

répondre à tous(1)
左手右手慢动作

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!