这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
前言
之前我们聊到了redis里面的SDS字符集的一个实现思路,今天我们继续来聊的内容,是redis的另一个数据类型,数组的底层实现.
对于数组结构来说,它的一个底层实现方式之一就是链表,今天我们就来看下,链表在redis里面是怎么实现的.
链表和链表节点的实现
同样的,链表节点的结构体也非常的简单
type listNode struct {
Prev *listNode // 前置节点
Next *listNode // 后置节点
Value interface{} //节点的值
}
从结构中我们可以知道,多个节点之间,是通过前后指针,把它们相互的连接起来的,也就是通过Prev和Next来实现一个双端的链表结构.
操作链表
链表其实就是通过大量的链表节点连接在一起之后,得出来的一个数据结构,那么我们再来看一下链表的一个底层实现
type List struct {
Head *listNode //表头节点
Tail *listNode //表尾节点
Len int //链表包含的节点数目
}
另外的,这个struct还有三个内置的方法,分别是节点的复制函数(dup),节点的释放函数(free),以及节点的对比函数(match)
链表特性总结
其实链表的实现总结起来一共可以分成四点:
- 双端,我们可以看到,每一个链表节点都带有prev和next指针,这样获取某个节点的前面的节点或者是后面的节点的时候,复杂度就是O(1)
2.无环: 链表节点的表头节点和表尾节点所指向的都是Null,所以他的访问是以Null为终结点的.
3.带着链表的长度: 这点跟SDS的是实现有点类似,在struct里面本身存储了链表的一个长度在里面.
- 多态性: 链表所能保存的值为interface,也就是任何值都可以保存作为链表的值.
最后
链表的实现被运用到了redis的各种功能实现里面去了,不只是常规的列表键,还有发布订阅等等,都是通过链表来实现的.