【Redis】数据结构 - 链表

本文详细介绍了Redis中链表数据结构的设计与实现,包括结构定义、特性及API介绍。链表在Redis中扮演重要角色,不仅用于实现列表键,还应用于发布与订阅、慢查询等多种功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis数据结构 - 链表

概述

链表提供顺序访问方式,有高效的节点重排能力和节点增删能力。

Redis由C语言实现, 但C语言没有自带链表的数据结构。因此Redis构建了自己的链表实现。

Redis应用广泛, 例如列表键的底层实现之一就是链表。当一个列表建包含了数量较多的元素时,又或者列表中包含的元素都是比较长的字符串时, Redis就会使用链表作为链表建的底层实现。

除链表建外,发布与订阅、慢查询、监视器等功能也用到了链表, Redis服务器本身还是用链表来保存多个客户端的状态信息,以及使用链表构建客户端输出缓冲区

结构定义

链表节点的结构体(C语言)

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

用list链表来持有链表, 操作起来更为方便

链表结构体:

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

特性

  • 双向链表, 访问一个节点的前一个节点或后一个节点的时间复杂度均为O(1)
  • 无环: 访问到NULL即为链表终点
  • 带头指针和尾指针: 访问链表两端的时间复杂度为O(1)
  • 带链表长度计数器: 获得链表长度时间复杂度为O(1)
  • 多态:提供void *类型的value值可以复制任意类型数据, 且可以自行设置复制、释放、比较等操作函数.

API

函数作用时间复杂度
listSetDupMethod将给定的函数设置为链表的节点值复制函数

复制函数可以通过链表的dup
属性直接获得,O(1)

listGetDupMethod返回链表当前正在使用的节点值复制函数O(1)
listSetFreeMethod将给定的函数设置为链表的节点值释放函数

释放函数可以通过链表的free
属性直接获得,O(1)

listGetFree返回链表当前正在使用的节点值释放函数

O(1)

listSetMatchMethod将给定的函数设置为链表的节点值对比函数对比函数可以通过链表的match
属性直接获得,O(1)
listGetMatchMethod返回链表当前正在使用的节点值对比函数O(1)
listLength返回链表的长度(包含了多少个节点)

链表长度可以通过链表的len
属性直接获得,O(1)

listFirst返回链表的表头节点

表头节点可以通过链表的head
属性直接获得,O(1)

listLast返回链表的表尾节点

表尾节点可以通过链表的tail
属性直接获得,O(1)

listPrevNode返回给定节点的前置节点

前置节点可以通过节点的prev
属性直接获得,O(1)

listNextNode返回给定节点的后置节点

后置节点可以通过节点的next
属性直接获得,O(1)

listNodeValue返回给定节点目前正在保存的值节点值可以通过节点的value属性直接获得,O(1)
listCreate创建一个不包含任何节点的新链表O(1)
listAddNodeHead

将一个包含给定值的新节点添加到给定链表
的表头

O(1)
listAddNodeTail

将一个包含给定值的新节点添加到给定链表
的表尾

O(1)
listInsertNode

将一个包含给定值的新节点添加到给定节点
的之前或者之后

O(1)
listSearchKey查找并返回链表中包含给定值的节点O(N),N 为链表长度
listIndex返回链表在给定索引上的节点O(N),N 为链表长度
listDelNode从链表中删除给定节点O(N),N 为链表长度
listRotate

将链表的表尾节点弹出,然后将被弹出的节
点插入到链表的表头,成为新的表头节点

O(1)
listDup复制一个给定链表的副本O(N),N 为链表长度
listRelease释放给定链表,以及链表中的所有节点O(N),N 为链表长度

参考: 《redis设计与实现》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值