Redis中存储一个字符串需要多大内存?

124 阅读1分钟

一个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的大小24key为一个sds的大小83+1+5)
value这块robj的大小16+sdshdr8的大小3+实际的字符大小5+1=27,所以也是32字节
2、执行set hello 1
验证发现内存新增了32字节。这个只有key分配了内存
注意这个value1在0-10000之间(不包括100003、执行set jun 10000
验证发现内存新增48字节;
24+8+16
4、执行set kai lkisjskdjksss
验证发现新增72字节,24+8+32+8,因为16+3+13+1=33,超过32,所以又重新分配了8