zoukankan      html  css  js  c++  java
  • Redis设计与实现 (二): 链表

      

    Redis实现为双链表结构, 列表键的底层实现之一就是链表,  发布与订阅, 慢查询, 监视器等功能都用到了链表. Redis本身也使用链表维持多个客户端.

    节点定义, 位于 adlist.h/listNode

    typedef struct listNode {
    
     // 前置节点
     struct listNode *prev;
    
     // 后置节点
     struct listNode *next;
    
     // 节点的值
     void *value;
    
    } listNode;

    链表结构定义, 位于adlist.h/list

    typedef struct list {
    
        // 表头节点
        listNode *head;
    
        // 表尾节点
        listNode *tail;
    
        // 节点值复制函数
        void *(*dup)(void *ptr);
    
        // 节点值释放函数
        void (*free)(void *ptr);
    
        // 节点值对比函数
        int (*match)(void *ptr, void *key);
    
        // 链表所包含的节点数量
        unsigned long len;
    
    } list;

    Redis链表特性总结 :

    1. 双端链表, 获取前驱和后置都为O(1);
    2. 无环, 表头的前驱和表尾的后置都为NULL;
    3. 带头指针和尾指针;
    4. 带链表长度计数器;
    5. 多态,  void * 保存点值,  通过list结构的dup, free, match三个属性设置节点特定函数, 所以可以用链表保存不同类型的值.
  • 相关阅读:
    第四章 高级查询(二)
    部分 语法Mysql
    MySQL高级查询
    BZOJ 3124 SDOI2013 直径
    BZOJ 3130 SDOI2013 费用流
    BZOJ 3993 SDOI2015 星际战争
    BZOJ 3997 TJOI2015 组合数学
    BZOJ 4003 JLOI2015 城池攻占
    BZOJ 3925 ZJOI2015 地震后的幻想乡
    codeforces #313 div1 E
  • 原文地址:https://www.cnblogs.com/tanxing/p/6711421.html
Copyright © 2011-2022 走看看