3.30--Redis之常用数据结构--链表(总结篇)------加油呀

Redis 的 List 对象的底层实现之一是链表

链表节点结构设计

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

有前置节点和后置节点,这个是一个双向链表
3.30--Redis之常用数据结构--链表(总结篇)------加油呀_第1张图片
list 结构为链表提供了链表头指针 head、链表尾节点 tail、链表节点数量 len、以及可以自定义实现的 dup、free、match 函数

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 结构和 3 个 listNode 结构组成的链表
3.30--Redis之常用数据结构--链表(总结篇)------加油呀_第2张图片
链表的优势与缺陷

Redis 的链表实现优点如下:

  1. listNode 链表节点的结构里带有 prev 和 next 指针,获取某个节点的前置节点或后置节点的时间复杂度只需O(1),而且这两个指针都可以指向 NULL,所以链表是无环链表;
    2.list 结构因为提供了表头指针 head 和表尾节点 tail,所以获取链表的表头节点和表尾节点的时间复杂度只需O(1);
    3.list 结构因为提供了链表节点数量 len,所以获取链表中的节点数量的时间复杂度只需O(1);
    4.listNode 链表节使用 void* 指针保存节点值,并且可以通过 list 结构的 dup、free、match 函数指针为节点设置该节点类型特定的函数,因此链表节点可以保存各种不同类型的值;

链表的缺陷:

1.链表每个节点之间的内存都是不连续的,无法很好利用 CPU 缓存。能很好利用 CPU 缓存的数据结构就是数组,因为数组的内存是连续的,这样就可以充分利用 CPU 缓存来加速访问。

2.保存一个链表节点的值都需要一个链表节点结构头的分配,内存开销较大

你可能感兴趣的:(redis,链表,数据结构,redis)