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

membalas semua(1)
左手右手慢动作

Ini berkaitan dengan versi redis.
Melihat pada fail object.c redis-3.0 dan versi terkini, anda boleh mendapati bahawa apabila mencipta StringObject, ia akan dibandingkan dengan REIDS_ENCODING_EMBSTR_SIZE_LIMIT nilai lalai ini ialah 39.
Melihat kod sumber versi redis-2.8, saya tidak menemui perbandingan, tetapi menciptanya secara langsung.
Jadi saya rasa pengekodan embstr ini hanya muncul dalam versi 3.0 ke atas.


Mengapa ia 39, ini lebih rumit untuk dijelaskan, jadi saya akan menerangkannya perlahan-lahan.
embstr ialah kawasan memori berterusan yang terdiri daripada redisObject dan sdshdr. Antaranya, redisObject menduduki 16 bait Apabila panjang rentetan dalam buf ialah 39, saiz sdshdr ialah 8+39+1=48, iaitu bait'.

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[];
};
Bermula dari versi 2.4, redis mula menggunakan pengalokasi memori jemalloc. Ini jauh lebih baik daripada malloc glibc dan menjimatkan memori. Ia boleh difahami dengan mudah di sini bahawa jemalloc akan memperuntukkan 8, 16, 32, 64 bait memori. Embstr minimum ialah 16+8+8+1=33, jadi peruntukan minimum ialah 64 bait. Apabila bilangan aksara kurang daripada 39, 64 bait diperuntukkan.

Beginilah asalnya nilai lalai 39.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan