redis数据结构之双端链表

来源:互联网 发布:csgofps优化cfgsteam 编辑:程序博客网 时间:2024/04/29 04:14

redis的链表数据结构基于adlist.h文件定义的以下三种数据结构来展开:

node

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

这里nodevalue为什么要弄成指针?

是为了兼容多种类型的node,显然这里的node既可以存储int等常规数字,也可以存string,当然也可以存其他的复杂的struct,想怎样都行,所以redis的链表在redis的很多重要功能(如发布与订阅,慢查询,监视器)中都有应用。

list

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

很明显,list采用如此大的结构体存储一个链表,是用空间换时间的路子,使得一些常用的链表操作能在O(1)的复杂度下拿下。

同时,list结构体中包含有三个函数指针,是为了兼容不同类型的value结点,可以为特定类型的结点定制自己的复制、释放、对比函数,非常灵活,这一种抽象思维值得借鉴。

迭代器iterator

typedef struct listIter {
    listNode *next;
    int direction;
} listIter

而迭代器的使用,则是一种外部封装,使得一些对特定数据结构的遍历,能用一套东西来完成,从而保护了内部的数据结构,也使得上层调用不用关心具体的实现,既安全又方便,何乐而不为?

【特么C++STL中也抽出了一个章节专门讲迭代器,当年学的现在也忘记的差不多了。以后有空要去补起来,很多语言的优点都是互相借鉴的,恩。。自己要多读书,夯实基础!】

0 0