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字节,
sizeof(double)=8字节
sizeof(zskiplist)=28字节,分配器分配32字节
sizeof(zskiplistNode)=24字节,sizeof(zskiplistLevel)=16字节