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(空字符)+ free

free

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

空间预分配

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

惰性空间释放

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

Tags: