redis使用redIsObject来表示是string、hash、list、set、zset五中数据类型,具体结构如下
typedefstruct redisObject {
unsigned type:4;
unsigned encoding:4;
/* lru time (relative to server.lruclock) */
unsigned lru:REDIS_LRU_BITS;
int refcount; void *ptr;
} robj;
//sdshdr结构体如下:
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
embstr编码是由redIsObject和sdshdr组成,redIsObject占用16字节,如果buf长度是39个字节,那么sdshdr就是8+39+1=48个字节,那么embstr就是64字节,而redis采用的是jemalloc内存分配器,可以分配8,16,32,64字节等大小的内存,而sdshdr最小分配8+8+1=17字节,那么embstr最小就是33字节,需要分配64字节。所以对于redis来说小于等于39字节的字符串采用embstr编码,大于则用raw编码。
embstr好处:
embstr编码是专门用于保存短字符串的一种优化编码方式,跟正常的字符编码相比,字符编码会调用两次内存分配函数来分别创建redisObject和sdshdr结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的空间,空间中一次包含redisObject和sdshdr两个结构。