Redis底层数据结构

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次内存重分配

只能保存文本数据

可以保存二进制数据和文本文数据

 

  • 链表:提供了高效的节点重排能力,顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度,其主要的特性:
  1. 双端:链表节点带有prev 和next 指针,获取某个节点的前置节点和后置节点的时间复杂度都是O(N)
  2. 无环:表头节点的 prev 指针和表尾节点的next 都指向NULL,对立案表的访问时以NULL为截止
  3. 表头和表尾:因为链表带有head指针和tail 指针,程序获取链表头结点和尾节点的时间复杂度为O(1)
  4. 长度计数器:链表中存有记录链表长度的属性 len
  5. 多态:链表节点使用 void* 指针来保存节点值,并且可以通过list 结构的dup 、 free、 match三个属性为节点值设置类型特定函数。

 

跳跃表:跳跃表是一种有序数据结构,通过在每个节点维持多个指向其他节点的指针,从而达到快速访问节点的目的。

层:跳跃表节点的层信息,保存在level数组中,数组的size范围为1-32。一般层数越多,访问其他节点的速度越快。
前进指针:指向表尾方向的下一个节点,如上图指向右方箭头所示,用于从表头向表尾访问节点。(遍历操作)
跨度:用于记录两个节点的距离,如上图箭头上的的数字所示,指向NULL的指针的跨度为0,用于计算排位(排位:查找某个节点时,沿途的所有层的跨度之和)。
后退指针:用于从表尾向表头方向访问节点,每次只能后退至前一个节点。
分值:用于节点的排序,节点按照分值从小到大排序。
成员对象:是一个指向字符串对象的指针,用于存储对象。(只用于保存字符串)。
注意:各节点的成员对象必须是惟一的,但是分值可以相同。分值相同的节点按照成员对象在字典序中的大小排序(从小到大)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值