链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。redis提供五种数据结构:String、hash、list、set、sorted set。这五大数据类型底层有不同的实现方式,给我们在数据结构类型的选择上更方便。底层数据结构的实现主要分为以下几块:链表、字典、跳跃表、整数集合、压缩列表、对象。首先来分析一下链表。
(1)listNode节点
在adlist.h结构来表示链表节点,如下图所示,
listNode通过prev和next指针组成双端链表:,如下图所示:
(2)list节点
虽然仅仅使用多个listNode结构就可以组成链表,但使用adlist.h/list来持有链表的话,操作起来更方便,如下图所示:
list结构为链表提供了表头指针、表尾指针、链表长度计数器、而dup用于复制链表节点所保存的数、 free用于释放链表节点所保存的值、match用于比较链表节点所保存的值和另一个输入值是否相等。
list节点和listNode节点的关系可以用下图来表示;
(3)总结
redis链表实现的特性总结如下:
(i)双端:获取某个节点的前置节点和后置节点的复杂度都是O(1)。
(ii)无环。
(iii)带表头指针和表尾指针
(iv)带链表长度计数器
(v)多态。
(4)用途
链表广泛应用于实现redis的各种功能,比如列表键、发布和订阅、慢查询、监视器等。