Redis中的链表
- 在Redis中链表常用于列表键、发布与订阅、慢查询、监视器等
- Redis服务器本身还用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区
链表的定义
typdef struct list {
// 表头节点
listNode * head;
// 表尾节点
listNode * tail;
// 链表所包含的节点数量
unsigned long len;
// 节点值负值函数
void *(*dup)(void *ptr);
// 节点值释放函数
void (*free)(void *ptr);
// 节点值对比函数
int (*match)(void *ptr, void *key);
}
链表的特点
- 双端
- 无环
- 带表头指针和表尾指针
- 带链表长度计数器
- 多态:链表可以用来保存各种不同类型的值
链表API
listSetDupMethod |
将给定的函数设置为链表的节点值复制函数 |
复制函数可以通过链表的dup属性直接获得,O(1) |
listGetDumpMethod |
返回链表当前正在使用的节点值复制函数 |
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为链表长度 |