• Redis设计与实现(2)链表和链表节点


    每一个链表节点

    1. typedef struct listNode{
    2. //前置节点
    3. struct listNode *prev;
    4. //后置节点
    5. struct listNode *next;
    6. //节点值
    7. void *value
    8. }lisNode;

    多个listNode可以通过pre和next指针组成双端链表

     虽然只要使用多个listNode结构就可以组成链表,但使用adlist.h/list来持有链表的话,操作会变得更加方便

    1. typedef struct list{
    2. //表头节点
    3. listNode *head;
    4. //表尾节点
    5. listNode *tail;
    6. //链表所包含的节点数量
    7. unsigned long len;
    8. //节点值复制函数
    9. void *(*dup)(void *ptr);
    10. //节点值对比函数
    11. int (*match)(void *ptr,void *key);
    12. }list;

     

    list 结构为链表提供了表头指针 head 、表尾指针 tail , 以及链表长度计数器 len , 而 dup 、 free 和 match 成员则是用于实现多态链表所需的类型特定函数:

    • dup 函数用于复制链表节点所保存的值;
    • free 函数用于释放链表节点所保存的值;
    • match 函数则用于对比链表节点所保存的值和另一个输入值是否相等。

     Redis的链表实现的特性可以总结如下:
    双端:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)。无环:表头节点的prev指针和表尾节点的next指针都指向NLL,对链表的访问以NuLL为终点。


    带表头指针和表尾指针:通过1ist结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)。


    带链表长度计数器:程序使用1ist结构的1en属性来对1ist持有的链表节点进行计数,程序获取链表中节点数量的复杂度为O(1)


    多态:链表节点使用voids 指针来保存节点值,并且可以通过1ist结构的cup、free 、 match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。

     链表被广泛用于实现 Redis 的各种功能, 比如列表键, 发布与订阅, 慢查询, 监视器, 等等。

    因为链表表头节点的前置节点和表尾节点的后置节点都指向 NULL , 所以 Redis 的链表实现是无环链表。

  • 相关阅读:
    Typescript 的 class 类
    一道有趣的最长子序列问题
    公众号免费注册教程
    2017 黑马 C++ 教学视频
    tp6获取请求参数
    构造+模拟,CF1148C. Crazy Diamond
    万博智云将亮相 2023 长沙·中国 1024 程序员节:普惠云容灾及提升碳效率的最佳实践
    php-面向对象OOP
    使用dotnet-monitor分析在Kubernetes的应用程序:Sidecar模式
    VUE后台管理系统模板
  • 原文地址:https://blog.csdn.net/qq_62773260/article/details/133966377