Redis核心原理-简单动态字符串SDS

SDS简介

Redis是C语言编写的,但没有使用c语言的字符串结构,而是本身实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理相似Java的ArrayList,扩容和缩短长度时能够减小内存频繁分配。数组

SDS用途

  • 包含字符串的键、值底层是用SDS实现
  • 持久化AOF的缓冲区实现

SDS属性原理

//记录buf数组中已使用字节的数量
  //等于SDS所保存字符串的长度
  int len;
  
  //记录buf数组中未使用字节的数量
  int free;
  
  //字节数组,用于保存字符串
  char buf[];

len

表示SDS所保存字符串的长度,获取字符串长度高效,时间复杂度为O(1)优化

buf[]

保存字符串的二进制数据,长度 = 字符数量 + 1(空字符)+ freecode

free

记录buf数组中未使用字节的数量,能够减小修改字符串带来的内存重分配次数;优化策略有空间预分配和惰性空间释放内存

空间预分配

扩大SDS空间时(好比两个字符串拼接)使用空间预分配不用随时分配内存,预分配规则为 len 小于 1M 时,free = len; len 大于1M 时 free = 1M字符串

惰性空间释放

缩短SDS空间时(好比剪切字符串)不当即回收内存,使用free来记录缩短长度,等待未来使用,避免内存浪费string

相关文章
相关标签/搜索