链表
链表提供了高效的节点的重排能力,以及顺序性的访问节点的方式,并且可以通过节点的增加或是删除来灵活的调整节点的长度.
在redis中链表结构使用非常广泛,其中列表键的底层实现方式之一就是链表.当一个列表键包含了数量过多的元素时,这时的列表键的就是使用链表结构来完成存储的.链表的详细的数据结构,这里不是重点.如果有想了解的,网上大神的文章都给出了详细的介绍和各种优秀的算法,不懂的自己去查阅.
由于个人水平有限,还望看过朋友不吝赐教指正文中理解不足或是错误的地方,本人不胜感激.
redis链表的实现
首先,上实例:
此时,列表键listKey存储的底层实现就是使用一个链表,链表的每个节点保存一个整数值.此外,除了列表键外,发布与订阅,慢查询,监视器等功能也都用到了链表.
一.redis链表节点和链表的实现
由于C中没有内置链表这种数据结构的实现,所以Redis构建了自己的实现.
链表节点的实现
链表节点Java伪代码实现:
Node节点可以通过prev和next属性字段组成双端链表.
链表的实现
链表Java伪代码实现:
通过ListNode持有Node节点,操作起来会更加方便.ListNode结构为链表提供了:表头head,表尾tail,以及链表长度len;而dup,free,match方法提供了多态链表的实现.
dup:用于复制链表节点所保存的值.
free:用于释放链表节点保存的值.
match:用于比较链表节点所保存的值和另一个传入的值是否相等.
二.redis链表的特性
1.双端. 链表节点提供有prev和next对象,获取某个节点的前置节点和下一个节点的速度为O(1).
2.无环. 表头节点prev对象和表尾节点next对象都指向NULL,链表的访问都是以NULL访问为终点.
3.带有表头和表尾对象.获取表头和表尾对象的速度为O(1).
4.带有长度计数器:获取链表长度的直接读取len字段值.速度为O(1).
5.多态:通过三个方法,实现链表的多态,保存不同类型的值.
总结:redis构建了自己的链表的实现.ListNode结构持有Node节点,通过增加head,tail,len成员来实现访问节点速度的提升;使用dup,free,match方法实现链表的多态,保存不同类型的值.