☃️概述
Redis
的 List
类型可以从首、尾操作列表中的元素:
☃️数据结构
哪一个数据结构能满足上述特征?
LinkedList
:普通链表,可以从双端访问,内存占用较高,内存碎片较多ZipList
:压缩列表,可以从双端访问,内存占用低,存储上限低QuickList
:LinkedList + ZipList,可以从双端访问,内存占用较低,包含多个ZipList,存储上限高
Redis
的List
结构类似一个双端链表,可以从首、尾操作列表中的元素:
在3.2版本之前,Redis采用ZipList和LinkedList来实现List,当元素数量小于512并且元素大小小于64字节时采用ZipList编码,超过则采用LinkedList编码。
在3.2版本之后,Redis统一采用QuickList来实现List:
☃️源码
☃️其他
底下的就别看了 就图一乐
在 Redis 中,List 类型的底层数据结构是双向链表(doubly linked list)。下面是关于 Redis List 类型底层数据结构的一些详细信息:
双向链表结构:
Redis 中的 List 类型使用双向链表来实现。每个节点包含了一个指向前一个节点和一个指向后一个节点的指针,这使得在链表中任意位置插入或删除节点的操作都很高效。
特点:
双向链表支持在列表头部和尾部进行快速的插入和删除操作,时间复杂度为 O(1)。
对于索引定位的操作,双向链表的性能相对较差,因为需要从头或尾依次遍历节点来找到指定位置的元素,时间复杂度为 O(n)。
节点结构:
每个节点由一个包含值的对象和两个指针组成。节点结构如下:
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value; } listNode;
头尾指针:
Redis 的 List 对象中包含指向链表头部和尾部的指针,即 head 和 tail 指针。这使得在列表的两端进行插入和删除操作都非常高效。
压缩列表:
在某些情况下,Redis 也可以使用压缩列表(ziplist)作为 List 的底层数据结构,主要是当列表元素数量比较少或元素都是较小的整数或短字符串时。但是,压缩列表不支持随机访问,而是通过遍历来获取元素,因此对于需要频繁随机访问的 List,Redis 会使用双向链表作为底层数据结构。
Redis 的 List 类型在大多数情况下使用双向链表作为底层数据结构,这种设计使得 List 支持高效的头尾操作,但在随机访问或根据索引查找元素时效率较低。