Redis底层数据库之SDS


  1. 高速的存储介质:内存
  2. 优秀的底层数据结构
  3. 高效的IO模型
  4. 高效的线程模型

1. 动态字符串SDS


Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是redis中最常用的一种数据结构。

C语言种字符串存在的一些问题:

  1. 获取字符串长度需要遍历运算
  2. 非二进制安全:假设之间有个结束字符(但未结束),就会提前被终止
  3. 不可修改:字符串被创建之后,被放在内存常量池中,不能修改某个字符,也不能拼接
    ![[Pasted image 20240402142712.png]]

所以Redis构建了一种新的字符串结构,成为简单动态字符串,简称SDS

Redis是C语言实现的,其中SDS是一个结构体,源码如下:
![[Pasted image 20240402143305.png]]

uint8_t:表示无符号整型
由于len是uint8_t类型,最大值为254,所以字符串最大长度为254(因为char buf[]仍然是C语言的字符串,会有一个结束符)
flags:表示不同的结构体类型
![[Pasted image 20240402144252.png]]

其中一个实例如下图所示:

![[Pasted image 20240402144554.png]]

SDS叫做动态字符串的原因在于其具有动态扩容的能力,分配策略如下:

  • 如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1(1表示结束字符);
  • 如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1,称为预分配,为了减少频繁去申请内存(消费Cpu性能和时间)
    ![[Pasted image 20240402145311.png]]

假如在该字符串追加一段”,AMY“,那么会去申请新空间(alloc为申请的存放字符的空间,不包含结束字符)
![[Pasted image 20240402145524.png]]

SDS的优点在于:

  1. 获取字符串长度的时间复杂度为O(1)
  2. 支持动态扩容
  3. 减少内存分配次数
  4. 二进制安全

相关推荐

  1. Redis数据结构字符串(sds)

    2024-04-07 23:30:03       5 阅读
  2. redis底层数据结构ziplist实现

    2024-04-07 23:30:03       37 阅读
  3. redis底层数据结构skiplist实现

    2024-04-07 23:30:03       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-07 23:30:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-07 23:30:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-07 23:30:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-07 23:30:03       20 阅读

热门阅读

  1. Windows常用命令

    2024-04-07 23:30:03       17 阅读
  2. 基于YOLOv8的木材缺陷检测系统说明

    2024-04-07 23:30:03       14 阅读
  3. stable diffusion 预处理器解释大全,不断更新

    2024-04-07 23:30:03       13 阅读
  4. Qt Creator 设置 One Dark Pro主题

    2024-04-07 23:30:03       14 阅读
  5. 代码随想录

    2024-04-07 23:30:03       12 阅读
  6. PTA--《面向对象程序设计》作业2-类与对象

    2024-04-07 23:30:03       15 阅读
  7. 等保模型(烂码)

    2024-04-07 23:30:03       11 阅读