Redis数据结构 - 链表(二)

概述

因为C语言中没有内置类似于链表的数据结构,Redis同样构建了自己链表的实现。Redis链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以增删节点来灵活的调整链表的长度。如列表键的底层实现就是一个链表,除此之外,发布订阅、慢查询、监视器等功能也用到了链表。

定义

下面我们看一下链表list和链表节点listnode的数据结构:
首先链表节点listnode有三个属性,前置节点prev、后置节点next 、节点值value,如下图所示:在这里插入图片描述
多个listnode节点组成了以一个双向链表,如下图所示:
在这里插入图片描述
如下图,是一个完成的list节点数据结构,分别有一个list和三个listnode结构组成链表;
在这里插入图片描述

  • dump函数常用于链表节点所保存的值;
  • free函数常用于释放链表节点保存的值;
  • match函数用于对比链表节点保存的值与另一个输入值是否相等;

特性

  • 双向:链表带有头指针和尾指针,获取某个节点的头指针和尾指针的时间复杂度都是O(1);
  • 无环:链表头节点的前置指针以及尾节点的后置指针都指向NULL,对链表的访问始终以NULL为重点;
  • 带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的时间复杂度都为O(1);
  • 长度计数器: 程序使用list的len属性对所持有的链表节点进行计数,程序获取链表长度的时间复杂度都为O(1);
  • 多态:链表节点使用void*指针来保存节点值,可以通过list结构的dup、free、match三个属性设置类型特定函数,所以链表可以保存不同类型的值;

总结

  • 链表被广泛应用于Redis各种功能,比如:列表键、发布与订阅、慢查询、监视器。
  • 每一个链表节点由一个listnode结构表示,每一个节点都有一个指向前置节点和后置节点的指针,所以Redis内部是双向链表。
  • 每一个链表使用list来表示,这种结构带有表头指针、表尾指针、链表长度等信息。
  • 链表表头的前置节点以及链表表尾的后置节点都指向NULL,因此链表是无环的。
  • 通过为链表设置不同类型特定函数,Redis可以保存各种不同类型的值。

猜你喜欢

转载自blog.csdn.net/weixin_42677165/article/details/89957908