一个RedisObject包含8字节的元数据和一个8字节指针 一个dictEntry有3个8字节的指针 jemalloc分配器在分配内存时,会做一些对齐。
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; //24bit
int refcount;
void *ptr;
} robj;
typedef struct dictEntry {
void *key;
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next;//hash一样时会用链表,指向下一个节点
} dictEntry;
示例:
说明一下:我使用的是redis-6.0.9版本
1、执行set hello world
验证发现内存新增了64字节。通过info memory命令看used_memory值的变化,单位是字节。
说一下这个64字节咋算的:
对于key来说,都会是一个dictEntry的大小24,key为一个sds的大小8(3+1+5)
value这块robj的大小16+sdshdr8的大小3+实际的字符大小5+1=27,所以也是32字节
2、执行set hello 1
验证发现内存新增了32字节。这个只有key分配了内存
注意这个value1在0-10000之间(不包括10000)
3、执行set jun 10000
验证发现内存新增48字节;
24+8+16
4、执行set kai lkisjskdjksss
验证发现新增72字节,24+8+32+8,因为16+3+13+1=33,超过32,所以又重新分配了8