Redis:开源,C语言编写的key-value数据库
字符串:Redis中的字符串并没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string SDS)的抽象类型,并且将SDS作为Redis的默认字符串表示,C字符串和SDS的区别:
C 字符串 | SDS |
获取字符串长度的复杂度为O(N) | 获取字符串长度的复杂度为O(1) |
API 是不安全的,可能会造成缓冲区溢出 | API 是安全的,不会造成缓冲区溢出 |
修改字符串长度N次必然需要执行N次内存重分配 | 修改字符串长度N次最多执行N次内存重分配 |
只能保存文本数据 | 可以保存二进制数据和文本文数据 |
- 链表:提供了高效的节点重排能力,顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度,其主要的特性:
- 双端:链表节点带有prev 和next 指针,获取某个节点的前置节点和后置节点的时间复杂度都是O(N)
- 无环:表头节点的 prev 指针和表尾节点的next 都指向NULL,对立案表的访问时以NULL为截止
- 表头和表尾:因为链表带有head指针和tail 指针,程序获取链表头结点和尾节点的时间复杂度为O(1)
- 长度计数器:链表中存有记录链表长度的属性 len
- 多态:链表节点使用 void* 指针来保存节点值,并且可以通过list 结构的dup 、 free、 match三个属性为节点值设置类型特定函数。
跳跃表:跳跃表是一种有序数据结构,通过在每个节点维持多个指向其他节点的指针,从而达到快速访问节点的目的。
层:跳跃表节点的层信息,保存在level数组中,数组的size范围为1-32。一般层数越多,访问其他节点的速度越快。
前进指针:指向表尾方向的下一个节点,如上图指向右方箭头所示,用于从表头向表尾访问节点。(遍历操作)
跨度:用于记录两个节点的距离,如上图箭头上的的数字所示,指向NULL的指针的跨度为0,用于计算排位(排位:查找某个节点时,沿途的所有层的跨度之和)。
后退指针:用于从表尾向表头方向访问节点,每次只能后退至前一个节点。
分值:用于节点的排序,节点按照分值从小到大排序。
成员对象:是一个指向字符串对象的指针,用于存储对象。(只用于保存字符串)。
注意:各节点的成员对象必须是惟一的,但是分值可以相同。分值相同的节点按照成员对象在字典序中的大小排序(从小到大)。