redis数据类型设计和实现(之二)链表

链表

   链表提供了高效的节点的重排能力,以及顺序性的访问节点的方式,并且可以通过节点的增加或是删除来灵活的调整节点的长度.

   在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方法实现链表的多态,保存不同类型的值.


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值