码迷,mamicode.com
首页 > 其他好文 > 详细

Redis设计与实现 (二): 链表

时间:2017-04-14 23:51:42      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:不同   使用   监视器   保存   void   查询   lis   底层实现   val   

  

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三个属性设置节点特定函数, 所以可以用链表保存不同类型的值.

 

Redis设计与实现 (二): 链表

标签:不同   使用   监视器   保存   void   查询   lis   底层实现   val   

原文地址:http://www.cnblogs.com/tanxing/p/6711421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!