redis数据结构---链表

链表作为一种常用的数据结构,内置在很多高级变成语言中,因为Redis使用的C语言中没有内置这种数据结构,所以Redis构建了自己的链表

每一个链表节点用一个 listNode 来表示

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

多个 listNode 可以通过 prev 和 next 来组成双端链表

 

Reids 还维护了一个 list 结构来持有链表,操作更加方便

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

} list

 

Redis 链表的特性:

  • 双端:链表节点带有 prev 和 next 指针,获取某个节点的前置和后置节点复杂度都是O(1);
  • 无环:表头节点的 prev 指针和表尾节点的 next 指针都指向 NULL 对链表的访问以 NULL 为终点;
  • 带有表头和表尾指针:通过 list 结构的 head 和 tail 指针,获取表头节点和表尾节点的复杂度为O(1);
  • 带有链表长度计数器:通过 list 结构的 len 属性来对 list 持有节点进行计数,获取节点数量复杂度为O(1);
  • 多态:链表节点使用 void* 指针来保存节点值,可以保存各种不同类型的值;    

用于操作列表和列表节点的API

 本文参考《Redis设计与实现》

posted @ 2021-12-16 08:25  {颜逸}  阅读(58)  评论(0编辑  收藏  举报