Redis底层数据结构之双端链表

链表这种数据结构相信大家也不陌生,有很多类型,比如单向链表,双向链表,循环链表等,链表相对于数组来说,一是不需要连续的内存块地址,二是删除和插入的时间复杂度是 O(1) 级别的,非常的高效,但比不上数组的随机访问查询方式。

一样的那句话,没有最好的数据结构,只有恰到好处的数据结构,比如我们后面要介绍的更高层次的数据结构,字典,它的底层其实就依赖的链表规避哈希冲突,具体的我们后面再说。

redis 中借助 C 语言实现了一个双向链表结构:

struct listNode{
    // 前一个节点的指针
    struct listNode *prev;
    // 后一个节点的指针
    struct listNode *next;
    // 节点值
    void *value;
};

prev 指针指向前一个节点,next 指针指向后一个节点,value 指向当前节点对应的数据对象。我盗一张图描述整个串联起来的链表结构:
在这里插入图片描述

虽然我通过链表的第一个头节点就可以遍历整个链表,但在 redis 向上封装了一层结构,专门用于表示一个链表结构:
在这里插入图片描述

struct list {
    // 表头节点
    listNode *head;
    // 表尾节点
    listNode *tail;
    // 链表长度
    unsigned long len;
    // 节点值复制函数
    void (*dup)(void *ptr);
    // 节点值释放函数
    void (*free)(void *ptr);
    // 节点值比对函数
    int (*match)(void *ptr,void *key)
}

list 结构为链表提供了表头指针 head 、表尾指针 tail , 以及链表长度计数器 len , 而 dup 、 free 和 match 成员则是用于实现多态链表所需的类型特定函数:

dup 函数用于复制链表节点所保存的值;
free 函数用于释放链表节点所保存的值;
match 函数则用于对比链表节点所保存的值和另一个输入值是否相等。

Redis链表的特性和优点:

由于是双向链表,具有前后节点的指针引用,所以对获取这两个节点的时间复杂度为O(1)。
通过链表长度len属性,获取长度的时间复杂度为O(1) 。
由于节点值是一个指针,所以value可以指定任何类型。
头节点的前指针和尾结点的后指针都为NULL,是无环的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值