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.
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.
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.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'.
Beginilah asalnya nilai lalai 39.