Redis-zset

162 阅读1分钟

1、先贴下有关的结构体

typedef struct zset {
    dict *dict;
    zskiplist *zsl;
} zset;

typedef struct zskiplist {
    struct zskiplistNode *header, *tail;
    unsigned long length;
    int level;
} zskiplist;

typedef struct zskiplistNode {
    sds ele;
    double score;
    struct zskiplistNode *backward;
    struct zskiplistLevel {
        struct zskiplistNode *forward;
        unsigned long span;
    } level[];
} zskiplistNode;

2、创建一个zset需要多少字节呢?

执行zadd hello 10 java命令
验证新增128字节。底层编码是ziplist
执行zadd hello 9 c
验证内存没有新增
执行zadd hello 10000 c++
验证新增16字节
先单独计算一个一个key消耗的字节:
	sizeo(dictEntry)=24字节
    sizeof(sdshdr8)+实际字符的大小+1=4+5=9,分配16字节
编码为ziplist时:
	sizeo(ziplist)=11字节,分配器分配16字节
    sizeof(robj)=16字节,
    sizeofdouble)=8字节
sizeof(zskiplist)=28字节,分配器分配32字节
sizeof(zskiplistNode)=24字节,sizeof(zskiplistLevel)=16字节