Redis 学习笔记

2018-08-05  本文已影响16人  xzing

这里只会记录在学习 Redis 源码时觉得比较好玩的地方,不会一五一十的讲细节。

内存分配

zmalloc 在实际 malloc 到的内存前面加一个 size

void *zmalloc(size_t size) {
    void *ptr = malloc(size+PREFIX_SIZE);
    *((size_t*)ptr) = size;
    update_zmalloc_stat_alloc(size+PREFIX_SIZE);
    return (char*)ptr+PREFIX_SIZE;
}

动态字符串 sds

sds 在基础的 char* 前面加一段 header 来记录信息(类似于 Go 实现)。

// 除了 sdshdr64,还有 sdshdr32、sdshdr16... 区分不同的长度上限
struct __attribute__ ((__packed__)) sdshdr64 {
    uint64_t len; /* used */
    uint64_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

sds sdsnewlen(const void *init, size_t initlen) {
    ...
    sh = s_malloc(hdrlen+initlen+1);
    s = (char*)sh+hdrlen;   // 实际字符串
    memcpy(s, init, initlen);
    return s;
}

字典 dict

跳跃表 zset

整数集合 intset

鸣谢

上一篇 下一篇

猜你喜欢

热点阅读