美文网首页程序员
Redis 源码--链表。

Redis 源码--链表。

作者: namelessEcho | 来源:发表于2017-09-28 22:03 被阅读0次

因为C语言是一个比较底层的语言,库内没有实现链表,于是Redis自己实现了链表。Redis的链表是一个双向链表。

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

redis通过一个结构体 list来操作链表,主要是保存长度和头部和尾部。所以redis的取链表的头部和尾部以及长度的操作都变成了O(1)。对于 head指针和tail指针,他们分别指向了链表的实际头和尾部指针,这个list还有一些其他属性,主要是函数指针,用来实现不同语义下的结点释放复制与比较过程。在没有对象这一说的C里通过函数指针实现了类似的多态过程。

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;

与此同时 还实现了自己的一个迭代器,若direction为AL_START_HEAD,则说明是正向遍历的,如果是AL_START_TAIL,则是反向遍历的。

typedef struct listIter {

    // 当前迭代到的节点
    listNode *next;

    // 迭代的方向
    int direction;

} listIter;

对于这个迭代器来说,通过暂存current之后的下一个结点,redis允许当前结点被删除,但是不允许删除非current的结点。那样明显的会导致链表元素的丢失。

listNode *listNext(listIter *iter)
{
    listNode *current = iter->next;

    if (current != NULL) {
        // 根据方向选择下一个节点
        if (iter->direction == AL_START_HEAD)
            // 保存下一个节点,防止当前节点被删除而造成指针丢失
            iter->next = current->next;
        else
            // 保存下一个节点,防止当前节点被删除而造成指针丢失
            iter->next = current->prev;
    }

    return current;
}

链表这一段的代码并不长,实现也比较简单,主要对链表有基本的了解,阅读起来没什么大的问题。

相关文章

  • Redis 源码--链表。

    因为C语言是一个比较底层的语言,库内没有实现链表,于是Redis自己实现了链表。Redis的链表是一个双向链表。 ...

  • redis-数据结构-链表

    tips:本文参照《redis设计与实现》、《数据结构与算法》、redis源码 链表提供了高效的节点重排能力,以及...

  • Redis双端链表

    本文摘抄自redis源码学习笔记 双端链表在Redis中的地位:它作为一种通用数据结构,在Redis的内部使用非常...

  • [redis 源码走读] 链表

    redis 的链表实现不是很复杂,从 listNode 可以知道,list 是一个双向链表,支持从链表首尾两边开始...

  • Redis的数据结构(二):链表

    链表在redis的应用 由于redis的c语言没有内置链表结构类型,因此redis自身实现了一套链表结构。链表主要...

  • Redis' lists

    Redis列表基本操作命令 Redis list底层结构 Redis list由链表来实现。在Redis中链表的应...

  • Redis数据结构——链表

    前言 Redis链表为双向无环链表! Redis使用了简单动态字符串,链表、字典(散列表)、跳跃表、整数集合、压缩...

  • [数据结构]第二章线性表(4)——双链表

    双链表 单链表VS双链表 双链表基本操作 初始化 插入 优化之后 删除 遍历 总结反思 源码 源码查看地址,点击 ...

  • Redis5.x底层数据结构之——链表

    Redis是C语言编写的,没有自带的链表结构,需要自己实现链表。链表被广泛用于Redis的各种功能,比如客户端状态...

  • Redis源码阅读笔记(2)-链表

    链表作为算法基础,相信大家都不会陌生。链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点...

网友评论

    本文标题:Redis 源码--链表。

    本文链接:https://www.haomeiwen.com/subject/rcovextx.html