Redis常见的数据结构与底层实现(未完待续)

33 阅读1分钟

Redis是个key-value形式的,其中key只能是String类型,而value的数据结构有:String、List、Hash、Set、Zset等

1.String

1.1 底层实现(Simple Dynamic String)

sds结构体

struct __atribute__ ((__packed__)) sdshdr8{
    uint8_t len;
    uint8_t alloc;
    unsigned char flags;
    char buf[];
}

Redis还定义了sdshr16、sdshr32、sdshr64结构体,其中sdshr8就等于说可以存放字符串小于256(2^8),以此类推,Redis字符串最多可以存储512MB

1.2 具体应用

缓存HTML片段、记录用户登录信息

2.List

2.1 底层实现(双向链表、压缩链表)

双向链表

typedef struct listNode{
    struct listNode *prev;
    struct listNode *next;
    void *value;
}

typedef struct list{
    listNode *head;
    listNode *tail;
    void *(*dup)(void *ptr);
    void (*free)(void *ptr);
    int (*match)(void *ptr, void *key);
    unsigned long len;
}list;

优点:可以用O(1)时间复杂度完成列表的头部或者尾部的插入和删除。

缺点:不能随机存取

压缩列表

总体布局
<zlbytes> <zltail>> <zllen> <entry> <entry> ... <entry> <zlend>

2.2 具体应用

消息队列

3.Hash

3.1 底层实现(哈希表、压缩列表)

哈希表

typdef struct dictEntry{
    void *key;
    union{
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    }v;
    stuct dictEntry *next;
}dictEntry;

typedef struct dictht{
    dictEntry **table;
    unsigned long size;
    unsigned long sizemask;
    unsigned long used;
}dictht;

3.2 具体应用

缓存数据库对象

4.Set

4.1 底层实现(整数集合 + 哈希表)

整数集合

typedef stuct intset{
    uint32_t encoding;
    uint32_t length;
    int8_t contents[];
}intset;

4.2 具体应用

抽奖系统、公共好友列表

5.Zset

5.1 底层实现(跳表、压缩列表)

跳表

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

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

5.2 具体应用

排行榜