Redis数据结构-链表

来源:互联网 发布:四年级数学优化 编辑:程序博客网 时间:2024/05/19 15:22

链表

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,可以通过增删节点来灵活的调整链表的长度。在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。发布订阅、慢查询、监视器等功能都用到了链表。Redis服务器本身还是用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区。

链表和链表节点的实现

每个链表节点使用一个adlist.h/listNode结构表示:

typedef struct listNode{    //前置节点    struct listNode *prev;    //后置节点    struct listNode *next;    //节点的值    void *value;}listNode;

使用多个listNode可以做成双链表,定义在adlist.h/list下:

typedef sturct list{    //表头结点    listNode *head;    //表尾节点    listNode *tail;    //链表包含的节点数    unsigned long len;    //节点复制函数    void *(*dup) (void *prt);    //节点值释放函数    void (*free) (void *prt);    //节点值对比函数    int (*match) (void *prt,void *key);}list;

Redis链表特性:

  • 双端:链表节点带有prev和next指针,获取某个节点的前置和后置节点的复杂度为O(1)
  • 无环:表头节点的prev指针和表尾节点的next指针指向NULL,对链表访问以NULL为终点。
  • 带表头指针和表尾指针:获取链表头尾节点的复杂度为O(1)
  • 带链表长度计数器:获取节点数目复杂度为O(1)
  • 多态:链表节点通过使用void* 指针保存节点值,可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,可以用于保存不用类型的值.
原创粉丝点击