美文网首页
深入理解Redis 数据结构—双链表

深入理解Redis 数据结构—双链表

作者: 小码A梦 | 来源:发表于2021-11-30 08:44 被阅读0次

在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个双向的数据结构,而 list 数据结构正是双向链表,类似 java 中的 LinekdList 链表列表。

链表提供了高效的节点重排能力,以及顺序的节点访问方式,通过修改节点的 pre 和 next 指针来修改链表的数据。

C 语言没有内置链表的数据结构,所以 Redis 构建了自己的链表结构。

链表的数据结构,链表以及链表节点

链表是由链表以及链表节点组成,每个链表节点使用一个 adlist.h/listNode 结构来表示:

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

多个 listNode 可以通过 prev 和 next 指针组成双链表的,如题所示:


listNode节点

多个 listNode 可以组成链表,但是为了方便管理,使用 adlist.h/list 管理链表,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 结构为链表提供了表头指针 head、表尾指针 tail,以及节点数量计算 len。下图展示一个由 list 结构和三个 listNode 节点组成的链表:


Redis 链表实现的特征有如下的总结:

  • 双向:链表节点带有 prev 和 next 指针,可以通过指针获取每一个数据
  • 快速计算链表长度:通过 list 结构中的 len 属性计算 list 的长度,而时间复杂度为O(1)
  • 多态: 链表节点使用 void* 指针保存节点,所以链表支持保存各种不同类型的值

双链表的运用

列表键,发布订阅、慢查询以及监视器等。

总结

  • 本文通过介绍链表的数据结构,链表是由链表和链表节点组成的
  • 链表节点都有一个前置和后置指针,所以 Redis 的链表是一个双向链表
  • 链表可以存储头结点,尾节点,更好的管理自己的节点,len 属性快速算出链表的长度
  • 链表通过 void* 以及不同的类型设定函数,所以链表可以不同的类型的值

如果觉得文章对你有帮助的话,请点个赞吧!

相关文章

  • 深入理解Redis 数据结构—双链表

    在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpo...

  • redis底层数据组织方式

    底层数据结构 redis底层数据结构有:字典、双端链表、压缩链表、整数集合、跳跃表和字典、整数集合、embstr ...

  • 链表

    链表数据结构 Redis的链表实现是双端链表,每个链表节点由一个listNode结构来表示,每个节点都有一个指向前...

  • redis双向链表实现(3)

    链表(list)是Redis中最基本的数据结构, 由adlist.h和adlist.c定义事务模块使用双端链表依序...

  • 数据结构学习笔记:链表基础(一)

    一.学习链表的意义 链表是一种最重要的动态数据结构更深入的理解引用(或者指针)更深入的理解递归组织更加复杂的数据结...

  • Redis双端链表

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

  • Redis 对象

    前面已经介绍了 SDS,双端链表,字典,整数集合,压缩列表等数据结构,但是Redis 并没有直接使用这些数据结构来...

  • Redis对象

    Redis用到的主要数据结构,如简单动态字符串、双端链表、字典、压缩列表、整数集合等。Redis并没有直接使用这些...

  • Redis有这一篇就够了

    Redis 数据结构 链表:列表建的底层实现(头指针和尾指针的双端链表) 字典:哈希键的底层实现 使用链地址法(数...

  • Redis - list底层数据结构实现

    前言 List是一个按加入时序排序的数据结构,Redis采用quicklist(双端链表) + ziplist 作...

网友评论

      本文标题:深入理解Redis 数据结构—双链表

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